【问题标题】:Java Regex for picking operands off an expression用于从表达式中挑选操作数的 Java 正则表达式
【发布时间】:2016-06-18 21:26:14
【问题描述】:

我有一种情况,我必须从表达式字符串中选择变量,如下所示。

name = 'Bruce Wayne' ||TrackId = 12 || age =9 &&sample = 7 || thisistoolong = 'asda'

我试过这个模式

"(([\\d\\s\\S&&[^\\&\\|]]+)=([\\d\\s\\S&&[^\\&\\|]]+))"

但它似乎没有扫描整个字符串。

我如何改进我的模式,以便它可以从上面的字符串中选择 'name' 、 'TrackId' 、 'age' 、 'sample' 和 'thisistoolong' (作为组)。

我知道我可以使用 String.split() 和/或可能递归一个更小的模式,但我认为如果我可以使用正则表达式来代替,它会更好地提高性能。 (还有更简洁的代码)

编辑:thisistoolong 可以是 Javascript 中包含 Javascript 有效值的常规变量名。感谢 Andreas 指出变量值可以包含“||”的极端情况和 '&&' 。参考 Bohemian 的回答,我得到了使用 Pattern.split() 的想法,这样我就可以使用预编译的正则表达式。

【问题讨论】:

  • 更容易使用yourString.split("||") 并回避更小的模式。
  • ifly6 - 我同意简单的部分,但我现在远离递归。如果这没有帮助,我可能会回到那个位置。
  • 一月 - 不。那也行不通。请注意,我使用的是基于 Perl 的 java regex。

标签: java regex pattern-matching


【解决方案1】:

不要纠结于“性能” - 使用拆分(使用正则表达式)和模式匹配器的各种解决方案都将具有大致相同的性能,这会很好(通常在 0.1 毫秒以下)。

这是一个单行:

String[] names = str.split(" =.*?($|\\s*(&&|\\|\\|)\\s*(?=(([^']*'){2})*[^']*$))");

参见ideone 演示。

正则表达式中的所有额外内容都允许名称和值包含&&||

【讨论】:

  • 现在好。当然,除非字符串文字包含&&||。正则表达式不是解析器,所以我将引用Jamie Zawinski有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
  • @andreas 名称中是否真的有可能包含||&&?真的???不允许这样做可以吗?那么空格呢?它们可以包含空格吗?在某些时候,禁止某些输入是合理的; API 的用户将接受合理的限制。
  • @Andreas 不过,我已经编辑了答案以允许 &&|| 在名称中。
  • 我同意name 可能不包含||&&,但我不能说thisistoolong 中会包含什么样的文字,你可以吗?正在分析的整个输入是动态的,因此您不知道它是什么,除了它是一个允许文本字面量的 表达式。因此,您需要一个解析器,而不是正则表达式来分析它。
  • 试试这个输入,正则表达式会失败:name = 'Bruce || Wayne' || TrackId = 12||age =9 && sample = 7 || thisistoolong = 'asda'。您可以尝试使用环视来使正则表达式复杂化来处理它,但是如果文本文字包含' 怎么办。好吧,它目前还没有被 OP 定义,但是如果它使用 C 风格的转义和\ 怎么办?现在你必须在不明显的组合中计算' \\。最好意识到正则表达式是解析表达式的一个糟糕选择,并让一个真正的表达式解析器参与进来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多