我有这个字符串:
ab ab-alfa beta gamma ab-delta
我想在每个单词中添加前缀“ab-”,除了已有单词的单词“ab”(第一个单词除外)。
我的意思是,我会得到这个结果:
ab ab-alfa ab-beta ab-gamma ab-delta
你知道一个正则表达式并解释它吗?
- 修改
到目前为止,我已经尝试了这个(link):
\b(?!ab)\w+\b
但我不认为我理解否定是如何运作的。
答案 0 :(得分:2)
您可以使用此正则表达式:
(?<![^ ])(?=[^ ])(?!ab)
替换ab-
。
(?<![^ ])(?=[^ ])
将搜索单词开头的边界(定义为非空格字符序列)。
通常,给定“单词字符”C的字符类,一般的“单词边界”(类似于\b
)将是:
(?:(?<!C)(?=C)|(?<=C)(?!C))
“单词”开头的边界是:
(?<!C)(?=C)
“单词”结尾的边界是:
(?<=C)(?!C)
这确保在空字符串中找不到“单词边界”,如果“单词字符”位于字符串的开头或结尾,则会找到“单词边界”。
请注意,(?<= )(?! )
乍一看可能看起来像(?<![^ ])(?=[^ ])
的等效模式,但是它不是,因为它无法匹配单词的开头单词出现在字符串中的索引0处。
另外,不要试图将其缩短为(?<![^ ])(?!ab| )
,当字符串为空时,它会返回匹配。
答案 1 :(得分:0)
试试这个正则表达式
(?<!ab-)(?!\bab\b)\b\w+\b
这是替换字符串
ab-$&