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

时间:2019-04-04 13:15:51

标签: regex ruby

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

例如:

"abc"   => "abc"
"ab+c"  => "abc"
"+abc"  => "+abc"
"-+abc" => "-abc"
"ab+-c" => "abc"

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

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

1 个答案:

答案 0 :(得分:5)

^(![\+\-\~]模式与的开头匹配,然后将!字符捕获到组1中,后跟+-~字符,因此您仅需删除行首的!+!~!-

您可以使用

/(?!\A)[+~-]/

它匹配不在字符串(+)开头的任何~-[+~-]字符((?!\A))。 (?!\A)是一个否定的超前查询,如果其模式与当前位置的右侧不立即匹配,则匹配失败。如果该位置位于字符串的开头(\A位于此位置),则匹配失败。由于\A是不消耗任何文本的锚点,即所谓的零长度模式,因此使用(?<!\A)进行前瞻或后瞻是没有区别的。

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

Ruby demo

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

输出:

"abc"
"abc"
"+abc"
"-abc"
"abc"