我正在尝试为以下情况编写正则表达式:
badword%
%badword
%badword%
%
标志不同,具体取决于它们的位置 . 前面的 %
需要一个lookbehind来匹配单词 badword
之前的字母,直到它到达一个非字母 . 同样地,任何不在前面的 %
都需要前瞻以匹配单词 badword
之后的字母,直到它碰到非字母 .
这就是我想要实现的目标 . 如果我有以下内容:
只是一个常规的超级记录 .
badword # should match "badword", easy enough
badword% # should match "badwording"
%badword% # should match "superbadwording"
同时 . 如果我有一个类似的句子:
这是另一个非常简单的例子 .
badword # should match "badword", easy enough
badword% # should also match "badword"
%badword% # should match "verybadword"
我不想使用空格作为断言捕获组 . 假设我想要捕获 \w
.
这是我到目前为止用Java编写的内容:
String badword = "%badword%";
String _badword = badword.replace("%", "");
badword = badword.replaceAll("^(?!%)%", "(?=\w)"); // match a % NOT at the beginning of a string, replace with look ahead that captures \w, not working
badword = badword.replaceAll("^%", "(?!=\w)"); // match a % at the beginning of a string, replace it with a look behind that captures \w, not working
System.out.println(badword); // ????
那么,我该怎么做呢?
PS:请不要认为 %
被迫进行比赛的开始和结束 . 如果一个 %
是第一个角色,那么它需要后面看看,任何和所有其他的 %
都是展望未来 .
2 回答
从你的问题来看,似乎没有必要使用环视,所以你可以用
\w*
替换所有%
片段:
\ w与#, - 等不匹配 . 所以我觉得\ S在这里更好
(?!=\w)
对于=\w
来说是一个负向前看,但看起来你想要一个积极的后视 . 其次,前瞻和后视是原子的,因此本身就不会捕捉,所以如果我的解释是正确的,你想要:"(?<=(\\w+))"
. 您需要额外的()
进行捕获 . 对于你的第一部分,它将是:"(?=(\\w+))
,第一个参数应该是"(?<!^)%"
.PS:
\\w
你需要两个反斜杠,而你似乎想要匹配多个字符,不是吗?如果是这样,你需要\\w+
. 此外,如果您不想每次都这样做,那么我建议使用String.format()
而不是replaceAll()
.