【问题标题】:java regex: negation of a matchjava regex:匹配的否定
【发布时间】:2015-06-17 01:46:38
【问题描述】:

虽然我阅读了大量关于该主题的帖子(特别是使用环视法),但我不明白这种更一般的情况是否可以使用正则表达式来解决。

设置:
1)
传入一个输入正则表达式 2) 输入的正则表达式被嵌入到一个负正则表达式中,这样
3) 输入正则表达式未识别的任何内容都匹配

示例:

给定:

input regex: "[-//s]";


text: "self-service restaurant"

我想要一个否定的正则表达式来嵌入我的输入正则表达式,以便我可以将我的文本匹配为:

"self", "service", "restaurant"

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

"restaurant"

注意,我想要做的可以通过更改输入正则表达式来实现

"[-//s]"


"[^-//s]"

然而,我正在寻求一种更通用的方法,其中任何正则表达式都可以传递到负正则表达式中。

【问题讨论】:

  • 试试[^-\\s]+。对所有人都使用相同的。
  • 看起来你想split你的字符串在传递的正则表达式上(你可能只想用(?:userRegex)+包围传递的正则表达式以避免像"fo--o".split("-")这样的空结果,结果是["fo", "", "o"] )。
  • String myRegex = "[^" + "yourRegexHere" 可能会成功,如果我正确理解您的问题。
  • 一般来说,没有“负正则表达式”之类的东西。唯一可以否定的正则表达式是字符类。甚至为 ab 这样简单的东西写否定句也相当复杂。

标签: java regex regex-lookarounds negation


【解决方案1】:

您可以通过匹配或拆分来实现。

  1. 通过匹配。

    String s = "self-service restaurant";
    Matcher m = Pattern.compile("[^-\\s]+").matcher(s);
    while(m.find()) {
        System.out.println(m.group());
    }
    

您需要将模式放在否定字符类中以匹配除否定类中存在的字符之外的所有字符。

  1. 通过拆分。

    String s = "self-service restaurant";
    String parts[] = s.split("[-\\s]+");
    System.out.println(Arrays.toString(parts));
    

这会根据一个或多个空格或连字符来拆分您的输入。稍后您可以加入他们以获得所需的输出。

  1. 通过替换。

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

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多