Java正则表达式:反向匹配

3
尽管我阅读了大量关于此主题(特别是使用lookarounds)的帖子,但我还没有理解是否可以使用正则表达式解决这个更一般的情况。
设置:
1)传入一个输入正则表达式
2)将输入正则表达式嵌入到否定正则表达式中,以便
3)匹配任何未被输入正则表达式识别的内容
示例:
给定:
input regex: "[-//s]";

并且

text: "self-service restaurant"

我需要一个负正则表达式,可以嵌入我的输入正则表达式,以便我可以将我的文本匹配为:
"self", "service", "restaurant"

重要的是,负正则表达式也应该能匹配一个简单的字符串,比如:

"restaurant"

请注意,我想要做的事情可以通过更改输入正则表达式来实现。
"[-//s]"

to

"[^-//s]"

然而,我想要一种更通用的方法,可以传入任何正则表达式到一个负面的正则表达式中。


请尝试使用[^-\\s]+。对于所有情况都使用相同的表达式。 - Avinash Raj
2
看起来你想要在传递的正则表达式上进行字符串split操作(你可能只需要将传递的正则表达式用(?:userRegex)+括起来,以避免出现空结果,例如 "fo--o".split("-"),其结果将是 ["fo", "", "o"])。 - Pshemo
如果我理解你的问题正确,那么 String myRegex = "[^" + "yourRegexHere" 可能会起到作用。 - Jonas Czech
一般来说,不存在所谓的“负正则表达式”。您唯一可以否定的是字符类。即使对于像 ab 这样简单的东西编写否定形式也相当复杂。 - RealSkeptic
1个回答

1
你可以通过匹配或分割来实现这一点。
  1. Through matching.

    String s = "self-service restaurant";
    Matcher m = Pattern.compile("[^-\\s]+").matcher(s);
    while(m.find()) {
        System.out.println(m.group());
    }
    
你需要将模式放在否定字符类中,以匹配除了否定类中存在的字符之外的所有字符。
  1. Through splitting.

    String s = "self-service restaurant";
    String parts[] = s.split("[-\\s]+");
    System.out.println(Arrays.toString(parts));
    
这将根据一个或多个空格或连字符分割您的输入。稍后,您可以将它们连接以获得所需的输出。
  1. Through replacing.

    String s = "self-service restaurant";
    System.out.println(s.replaceAll("[-\\s]+", "\\\n"));
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接