正则表达式(ruby)删除字符集的所有实例(当它们位于字符串的开头时)

Max*_*ams 2 ruby regex

我想["+", "-", "~"]从字符串中删除这些字符的所有实例,除非它们出现在字符串的开头。

例如:

"abc"   => "abc"
"ab+c"  => "abc"
"+abc"  => "+abc"
"-+abc" => "-abc"
"ab+-c" => "abc"
Run Code Online (Sandbox Code Playgroud)

请注意,第四个+字符已删除,因为它不是第一个字符。因此,如果字符串的开头有多个“不需要的”字符,则我们仅保留第一个字符。

我对此不太了解正则表达式的语法。有人可以帮忙吗?我使用的是Ruby,但正则表达式的语法在各种语言中趋于相同。

Wik*_*żew 5

^(![\+\-\~]模式的开始匹配线,然后捕获到组1中的!字符,随后用+-~字符,所以你只删除!+!~或者!-在一个行的开始。

您可以使用

/(?!\A)[+~-]/
Run Code Online (Sandbox Code Playgroud)

它匹配任何+~-字符([+~-]即不在该字符串的开头() (?!\A))。该(?!\A)是负先行失败的比赛,如果它的模式不匹配,立即到当前位置的右侧。如果位置在字符串的开头(\A此位置就是资产),则匹配失败。由于\A是不消耗任何文本的锚点,即所谓的零长度模式,因此,如果使用前向或后向,则没有区别(?<!\A)

确保-它位于字符类的开始或结尾,而不必逃脱它。

Ruby演示

strs = ["abc", "ab+c", "+abc", "-+abc", "ab+-c"]
strs.each { |x| p x.gsub(/(?!\A)[-+~]/, "") }
Run Code Online (Sandbox Code Playgroud)

输出:

"abc"
"abc"
"+abc"
"-abc"
"abc"
Run Code Online (Sandbox Code Playgroud)