我是Java初学者并且给出了像
这样的句子"Se excluye arbitraje de ley y [rotura de lunas]Gar_1.
Se excluye arbitraje de ley y [rotura de lunas]noGar"
我想识别
"[rotura de lunas]Gar_1" and "[rotura de lunas]noGar".
所以,我写了以下正则表达式:
"(.\*)Gar_1 (.\*) \\1noGar".
只要附加到"Gar_1"
的字符串和附加到"noGar"
的字符串之间没有标点符号,此操作就可以正常工作。但是,只要我有一个句号(.
),就像我在开头写的句子一样,那么找不到匹配。我已经尝试将"(\\pP)*"
之类的内容添加到我的正则表达式中,尝试在我想要识别的两个字符串之间包含标点符号的可能性,但这也不起作用。
有人能帮助我吗?
答案 0 :(得分:2)
这应该适合你:
\[.+?\]\w+
它将非贪婪地匹配[]
之间的所有内容,而\w
表示任何字字符,以便匹配您要捕获的字符串的最后部分。
答案 1 :(得分:0)
(.\*)
的语法似乎有误。是Java吗?
我会尝试使用Greedy Quantifier:"(.*?)Gar_1 (.*?) \\1noGar"
。
在http://docs.oracle.com/javase/tutorial/essential/regex/quant.html
了解详情答案 2 :(得分:0)
此正则表达式将您想要的字符串捕获到第1组和第3组:
(?s)((\[[^\]]*\])Gar_1).*?\2noGar
在demo中,查看右侧窗格中的第1组和第3组。
检查它们:
Pattern regex = Pattern.compile("(?s)((\\[[^\\]]*\\])Gar_1).*?\\2noGar", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
// do something with Gar_1: regexMatcher.group(1)
System.out.println(regexMatcher.group(1));
// do something with nogar: regexMatcher.group(3)
System.out.println(regexMatcher.group(3));
}
}
(?s)
启用DOTALL
模式,允许点跨行匹配((\[[^\]]*\])Gar_1)
将[rotura de lunas]Gar_1
捕获到第1组。在其中,(\[[^\]]*\])
匹配[rotura de lunas]
并将其捕获到第2组.*?
懒洋洋地吃掉角色,直到我们能够匹配...... \2noGar
,即第2组,后跟noGar
,即[rotura de lunas]noGar
简单替换
您可以在感兴趣的组周围添加捕获括号,以帮助您构建替换字符串。例如,这会将Gar1
替换为noGar
String subject = "[rotura de lunas]Gar_1 blah [rotura de lunas]noGar";
String replaced = subject.replaceAll("(?s)((\\[[^\\]]*\\])Gar_1)(.*?)(\\2noGar)", "$2noGar$3$4");
System.out.println(replaced);
请参阅online demo底部的输出。
答案 3 :(得分:0)
问题来自与.*
不匹配的换行符。要更改.
的此默认行为,您必须使用可以使用(?s)
设置的单线模式。例如:
(?s)(\\[[^]]*\\])Gar_1\\b(.*?)\\1noGar\\b
答案 4 :(得分:0)
我不知道我是否真的理解了这个问题,你应该提供更多相关信息,但是如果你想确定noGar和Gar_1之前的内容,你可以使用前瞻。
\[.*\](?=(Gar_1|noGar))
它应该给你2场比赛。
[rotura de lunas]