【问题标题】:Display unmatched strings, regex negation显示不匹配的字符串,正则表达式否定
【发布时间】:2011-11-07 00:20:50
【问题描述】:

有没有什么方法可以使用 Java 显示除一组单词或数字范围之外的所有字符和字符串?例如:

正则表达式:

^(if|else),[0-9] 

输入字符串:

if x <= 7

输出:

无法识别的令牌:

x , <=

由于“if”和7被否定,它们不会出现。 我可以在一个正则表达式中否定一组字符串和数字范围吗? 或者有没有其他方法可以显示不匹配的字符串? 我们的任务是显示已识别的标记,然后显示不匹配的标记。我已经研究了三天的正则表达式,但我仍然无法完成我的任务。提前感谢您的帮助。

【问题讨论】:

  • 我认为你不能用正则表达式否定字符串,至少在 Java 中是这样。您必须编写一个匹配其他任何内容的正则表达式。例如,要匹配除stack 之外的任何字符串,您需要[^s].*|s[^t].*|st[^a].*|sta[^c].*|stac[^k].*|stack.+(允许使用stackXXX)。想象一个正则表达式来匹配除了几个单词之外的任何东西......一团糟。
  • 顺便说一句,您在谈论令牌,但您没有说明它们是如何定义的。你的意思是令牌是用空格分割字符串的结果吗?那么,你想单独测试每个令牌吗?

标签: java regex negate


【解决方案1】:

我会使用String.split() 将字符串拆分为标记,然后将每个标记与您的“过滤器列表”进行比较。

即使您可以使用正则表达式完成此操作,也不会那么简单。

编辑:

事实上,您甚至可能不需要遍历结果。您可能会拆分“过滤器”单词。例如:

String[] results = s.split(" *if *| *else *| *[0-9]+ *| +");

请注意,您必须在表达式中添加一个空格,因为我假设您不希望x &lt;= 成为结果中的单个标记。此外,在关键字周围添加空格将确保您的结果集中不会出现空字符串。

【讨论】:

  • @jtahlborn 在正则表达式中没有否定并不难!只需学会使用环视。
  • @tchrist - 想发布一个例子吗?我承认我对正则表达式环视没有很多经验。
【解决方案2】:

根据问题的复杂性,您可以尝试否定前瞻断言:

\b((?!if|else|\d)\w+)\b

或某种疯狂的后视和负前瞻的组合:

((?<=\A|\s)(?!if|else|\d)\S+)

【讨论】:

    【解决方案3】:

    是的,我必须将词位(if、else、main)分类为标记(关键字) 0-9 为 NUM,以此类推...

    \b((?!if|else|\d)\w+)\ 哎呀,我的错,它确实有效。我不小心删除了| .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2013-12-25
      相关资源
      最近更新 更多