正则表达式中的标点符号

时间:2014-06-20 10:57:59

标签: java regex

我是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)*"之类的内容添加到我的正则表达式中,尝试在我想要识别的两个字符串之间包含标点符号的可能性,但这也不起作用。

有人能帮助我吗?

5 个答案:

答案 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]