有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正则表达式中的java标点符号

我是一个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) 个答案

  1. # 1 楼答案

    此正则表达式捕获要添加到组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底部的输出

  2. # 2 楼答案

    这应该适合您:

    \[.+?\]\w+

    它将不贪婪地匹配[]之间的所有内容,\w表示任何单词字符,因此将匹配要捕获的字符串的最后一部分

  3. # 3 楼答案

    我不知道我是否真的理解了这个问题,你应该提供更多的信息,但是如果你想确定在noGar和Garu 1之前是什么,你可以使用前瞻

    \[.*\](?=(Gar_1|noGar))
    

    它应该给你2根火柴

    [月神之轮]

  4. # 5 楼答案

    问题源于换行符与.*不匹配。要更改.的此默认行为,必须使用可以使用(?s)设置的单线模式。例如:

    (?s)(\\[[^]]*\\])Gar_1\\b(.*?)\\1noGar\\b