Regex 添加OR时正则表达式模式失败?
下面的模式非常有效,我得到了数百个结果Regex 添加OR时正则表达式模式失败?,regex,bash,shell,unix,Regex,Bash,Shell,Unix,下面的模式非常有效,我得到了数百个结果 xargs pcregrep -M "select.*table(.)*" >> $grep_out 此返回(示例): 将OR添加到最后一个结束字符时,得到0个结果: xargs pcregrep -M "select.*table(.|\n)*" >> $grep_out 这对我来说毫无意义。我正在添加OR-从逻辑上讲,它不应该做任何事情,而是扩展我的搜索,并增加我的结果。不要减少它们。这里发生了什么?因为您使用的是多行,所以
xargs pcregrep -M "select.*table(.)*" >> $grep_out
此返回(示例):
将OR添加到最后一个结束字符时,得到0个结果:
xargs pcregrep -M "select.*table(.|\n)*" >> $grep_out
这对我来说毫无意义。我正在添加OR-从逻辑上讲,它不应该做任何事情,而是扩展我的搜索,并增加我的结果。不要减少它们。这里发生了什么?因为您使用的是多行,所以您将匹配文件中的第一个
选择表
,然后由于(.\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 ",
不过,或
组件没有问题
$ 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
因此,您的问题在其他地方。请添加样本数据。我无法用您的样本数据重现这一点。使用
bash
4.2.45(1)-release和pcregrep
8.31进行测试。为什么你总是把星号放在引号之外?我知道它将匹配文件的其余部分-目的是在“(.|\n)”之后放置另一个字符串,但我已将问题缩小到这一点。感谢您尝试帮助测试这一点,但您没有测试所呈现的案例-它位于第二个单词之后。在第一个单词后面加上“(.|\n)”对我也很有用。@user1472747星号在引号之外,因为它正在测试当前目录中的所有文件;这是一个globbing表达式,不是正则表达式的一部分。@user1472747,事实上,我测试了这个例子;这是我回答的第一件事,其中file.txt
包含要匹配的行。当使用第二个正则表达式进行测试时,它可以工作。
$ 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