我正在尝试在Java中操作一个字符串来识别markdown options in Facebook Messenger。
我在几个在线测试人员中测试了RegEx,它工作正常,但当我尝试用Java语言实现时,它只能识别由下划线包围的文本。我这里有一个例子说明了这个问题:
private String process(String input) {
String processed = input.replaceAll("(\\b|^)\\_(.*)\\_(\\b|$)", "underscore")
.replaceAll("(\\b|^)\\*(.*)\\*(\\b|$)", "star")
.replaceAll("(\\b|^)```(.*)```(\b|$)", "backticks")
.replaceAll("(\\b|^)\\~(.*)\\~(\\b|$)", "tilde")
.replaceAll("(\\b|^)\\`(.*)\\`(\\b|$)", "tick")
.replaceAll("(\\b|^)\\\\\\((.*)\\\\\\)(\\b|$)", "backslashparen")
.replaceAll("\\*", "%"); // am I matching stars wrong?
return processed;
}
public void test() {
String example = "_Text_\n" +
"*text*\n" +
"~Text~\n" +
"`Text`\n" +
"_Text_\n" + // is it only matching the first one?
"``` Text ```\n" +
"\\(Text\\)\n" +
"~Text~\n";
System.out.println(process(example));
}
我希望所有行都会匹配并被替换,但只有第一行匹配。我想知道这是不是因为它是第一行,所以我在中间复制了它,它匹配了两行。然后我想我可能遗漏了一些与特殊字符匹配的东西,所以我添加了一些代码片段来匹配星号,并用百分号替换它,它起作用了。我得到的输出是这样的:
underscore
%text%
~Text~
`Text`
underscore
``` Text ```
(正文)
~文本~
你知道我可能遗漏了什么吗?
谢谢。
发布于 2020-05-15 21:45:45
如果使用单词边界,则不需要交替匹配锚点,因为单词边界也会匹配开始和结束位置。所以这实际上是多余的匹配:
(?:^|\b)
(?:\b|$)
这两个都可以被\b
取代。
但是,看看你的正则表达式,请注意,只有下划线被认为是一个单词字符,而*
,~
,`
不是单词字符,因此不能在这些字符周围使用\b
,而应该使用\B
,这与\b
相反。
除此之外,还可以做一些更多的改进,比如使用一个否定的字符类来代替贪婪的.*
,以及删除不必要的组。
代码:
class MyRegex {
public static void main (String[] args) {
String example = "_Text_\n" +
"*text*\n" +
"~Text~\n" +
"`Text`\n" +
"_Text_\n" + // is it only matching the first one?
"``` Text ```\n" +
"\\(Text\\)\n" +
"~Text~\n";
System.out.println(process(example));
}
private static String process(String input) {
String processed = input.replaceAll("\\b_[^_]+_\\b", "underscore")
.replaceAll("\\B\\*[^*]+\\*\\B", "star")
.replaceAll("\\B```.+?```\\B", "backticks")
.replaceAll("\\B~[^~]+~\\B", "tilde")
.replaceAll("\\B`[^`]+`\\B", "tick")
.replaceAll("\\B\\\\\\(.*?\\\\\\)\\B", "backslashparen");
return processed;
}
}
https://stackoverflow.com/questions/61828149
复制相似问题