我想从字符串中删除这些字符["+", "-", "~"]
的所有实例,除非它们出现在字符串的开头。
例如:
"abc" => "abc"
"ab+c" => "abc"
"+abc" => "+abc"
"-+abc" => "-abc"
"ab+-c" => "abc"
请注意第四点,+
已删除,因为它不是第一个字符。因此,如果字符串的开头有多个“不需要的”字符,我们将仅保留第一个。
对此我不太清楚正则表达式的语法。有人可以帮忙吗?我使用的是Ruby,但正则表达式的语法趋向在各种语言中都相同。
答案 0 :(得分:5)
^(![\+\-\~]
模式与行的开头匹配,然后将!
字符捕获到组1中,后跟+
,-
或~
字符,因此您仅需删除行首的!+
,!~
或!-
。
您可以使用
/(?!\A)[+~-]/
它匹配不在字符串(+
)开头的任何~
,-
或[+~-]
字符((?!\A)
)。 (?!\A)
是一个否定的超前查询,如果其模式与当前位置的右侧不立即匹配,则匹配失败。如果该位置位于字符串的开头(\A
位于此位置),则匹配失败。由于\A
是不消耗任何文本的锚点,即所谓的零长度模式,因此使用(?<!\A)
进行前瞻或后瞻是没有区别的。
确保-
位于字符类的开头或结尾,并且不必逃脱它。
strs = ["abc", "ab+c", "+abc", "-+abc", "ab+-c"]
strs.each { |x| p x.gsub(/(?!\A)[-+~]/, "") }
输出:
"abc"
"abc"
"+abc"
"-abc"
"abc"