在Ruby中,如何匹配字符串中的所有字符,直到匹配子字符串?

oxo*_*oxo 12 ruby regex string

说我有一个字符串: Hey what's up @dude, @how's it going?

我想删除之前的所有字符@how's.

Vas*_*ich 18

或者与正则表达式:

str = "Hey what's up @dude, @how's it going?"
str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?"
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读有关环顾的内容

  • 当`sub!`会做的时候,不需要`gsub!`,对吗?还要注意(根据我的回答)你需要`\ A`锚点和/或`m`标志,以防字符串在匹配的文本之前有换行符. (3认同)
  • 确定,固定.(/我已添加) (2认同)
  • Suuuuper很老,你显然可能现在已经知道差异,但很高兴看到n00bs的答案有所改变:gsub进行全局搜索并在第一场比赛后进行替换.gsub可能导致意外结果或性能不佳是更长的字符串. (2认同)

Sim*_*tti 14

使用String#slice

s = "Hey what's up @dude, @how's it going?"
s.slice(s.index("@how")..-1)
# => "@how's it going?"
Run Code Online (Sandbox Code Playgroud)

  • 他想在比赛前剥掉一切,就像说"比赛后保持一切"一样. (2认同)

Phr*_*ogz 6

实际上有几种方法可以做到这一点.以下是我将使用的:

如果要保留原始字符串:

str = "Hey what's up @dude, @how's it going?"
str2 = str[/@how's.+/mi]
p str, str2
#=> "Hey what's up @dude, @how's it going?"
#=> "@how's it going?"
Run Code Online (Sandbox Code Playgroud)

如果要改变原始字符串:

str = "Hey what's up @dude, @how's it going?"
str[/\A.+?(?=@how's)/mi] = ''
p str
#=> "@how's it going?"
Run Code Online (Sandbox Code Playgroud)

...要么...

str = "Hey what's up @dude, @how's it going?"
str.sub! /\A.+?(?=@how's)/mi, ''
p str
#=> "@how's it going?"
Run Code Online (Sandbox Code Playgroud)

您需要在\A字符串的开头锚定,并使用该m标志以确保您在多行之间进行匹配.

也许最简单的是改变原作:

str = "Hey what's up @dude, @how's it going?"
str.replace str[/@how's.+/mi]
p str
#=> "@how's it going?"
Run Code Online (Sandbox Code Playgroud)