【问题标题】:Regex pattern failing when adding an OR?添加 OR 时正则表达式模式失败?
【发布时间】:2013-11-25 20:33:55
【问题描述】:

下面的模式效果很好,我得到了数百个结果。

xargs pcregrep -M "select.*table(.)*" >> $grep_out

这会返回(样本):

./mo/module1/module1.4gl: call error("Prepare select_table failed.")
./mo/module1/module1.4gl: declare select_table cursor with hold for sel_table
./mo/module1/module1.4gl: let prep = " select * from table ",

当我在最后一个结束字符上添加 OR 时,我得到 0 个结果:

xargs pcregrep -M "select.*table(.|\n)*" >> $grep_out

这对我来说完全没有意义。我正在添加一个 OR - 从逻辑上讲,它不应该做任何事情,只是扩展我的搜索并增加我的结果。不要减少它们。这是怎么回事?

【问题讨论】:

  • 请添加示例数据
  • 我无法用您的示例数据重现这一点。使用bash 4.2.45(1)-release 和pcregrep 8.31 测试。

标签: regex bash shell unix


【解决方案1】:

由于您使用的是多行,您将匹配文件中的第一个select table,然后由于(.\n)*,您将匹配文件的其余部分。只注意单个匹配:

$ pcregrep -M "select.*table(.|\n)*" *
file.txt:call error("Prepare select_table failed.")
declare select_table cursor with hold for sel_table
let prep = " select * from table ",

不过,OR 组件没有问题。

$ pcregrep -M "FOO(\n)" *
file.txt:FOO
file.txt:FOO

$ pcregrep -M "FOO(.)" *
file.txt:FOOF

$ pcregrep -M "FOO(.|\n)" *
file.txt:FOO
file.txt:FOOF
file.txt:FOO

所以,你的问题在别处。

【讨论】:

  • 为什么你总是把你的星号放在引号外面?而且我知道它会匹配文件的其余部分 - 目的是在“(。| \ n)”之后放置另一个字符串,但我已将问题缩小到这一点。感谢您尝试帮助测试这一点,但您没有测试提供的案例 - 它在第二个单词之后。在第一个单词之后加上“(.|\n)”也对我有用。
  • @user1472747 星号在引号之外,因为它正在测试当前目录中的所有文件;这是一个通配符,不是正则表达式的一部分。
  • @user1472747 事实上,我确实测试了这个案例;这是我回答中的第一件事,其中file.txt 包含您要匹配的行。使用您的第二个正则表达式测试时哪个有效。
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 2018-04-24
  • 2020-10-15
  • 2019-11-09
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多