【问题标题】:Greedy and non-greedy regex贪婪和非贪婪的正则表达式
【发布时间】:2013-05-08 19:29:45
【问题描述】:

我目前有这个正则表达式:this\.(.*)?\s[=,]\s,但是我遇到了一个无法修复的泡菜。

我尝试了以下正则表达式,它有效,但它也捕获了我不想要的空间:this\.(.*)?(?<=\s)=|(?<!\s),。我想要做的是匹配标识符名称。我想要的一个例子和结果是这样的:

this.""W = blah; 将匹配 ""W。上面的第二个正则表达式几乎完美地做到了这一点,但是它也捕获了第一组中= 之前的空间。有人可以指出正确的方向来解决这个问题吗?

编辑:不简单地在通配符组中使用[^\s] 的原因是有时我可以得到这样的行:this. "$ = blah;

EDIT2:现在我有另一个问题。它与param1.readBytes(this.=!3,0,param1.readInt()); 之类的行不匹配。而不是匹配=!3,而是匹配=!3,0。有没有办法来解决这个问题?同样,我不能简单地使用[^,],因为可能有像param1.readBytes(this.,3$,0,param1.readInt()); 这样的名称应该匹配,3$

【问题讨论】:

  • 您用什么语言编写程序?
  • 那么如何判断逗号是属于 this.identifier 还是作为函数参数的分隔符?
  • 有没有办法在正则表达式中向后阅读?例如,从; 开始并返回直到通过两个, 然后开始捕获直到找到this.?或者那不可能……
  • 那么如果第三个参数中有一个this.,3$ 会发生什么?
  • 它不会,如果是,那么我想提取它,这样正则表达式仍然有效。我想我可以通过锚定到行尾然后做类似this\.(.*)?,.*?,.*);$ 来解决Edit2

标签: regex


【解决方案1】:

(.*) 将匹配任何字符,包括空格。 要强制它不以空格结尾,请将其更改为 (.*[^\s])

例如: this\.(.*[^\s])?\s?[=,]\s

对于您的第二次编辑,您似乎正在做一个语言解析器。尽管正则表达式很强大,但它们也有局限性。你需要一个语法解析器。

【讨论】:

  • 然后试试这个this\.(.*[^\s])?\s?[=,]\s
  • 像魅力一样工作!非常感谢!编辑您的答案,我会将其标记为正确
【解决方案2】:

也许您可以在第一个块中告诉您捕获非空格字符,而不是任何字符。

this\.(\S*)?(?<=\s)=|(?<!\s),

【讨论】:

  • 对不起,我会更新我的问题,字段名称可以包含空格,所以这是不行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2013-02-15
  • 1970-01-01
  • 2011-04-27
  • 2010-10-20
相关资源
最近更新 更多