我有一个文件,其中包含几个由单引号('
)限定的字符串。这些字符串可以包含空格,有时会出现在多行中;但是,没有字符串包含引号('
)标记。我想创建一个查找包含字符"$"
的字符串的正则表达式。我想到的正则表达式:'[^']*\$[^']*
无法搜索多行。我怎么能这样做呢?
答案 0 :(得分:0)
你的正则表达式可以搜索多行。如果它没有在您的 之外的代码中出现错误。 (提示:[^']
确实包含换行符。)
这个表达式怎么样(它可以防止无用的回溯):
'([^'$]*\$[^']*)'
答案 1 :(得分:0)
您没有告诉我们您使用的是哪种语言,因此我们只能推测。这里有两个问题,真的:
如果您在前一组,我们可以帮助您。但问题不在于正则表达式,而在于如何应用它。 (但是我在下面的正则表达式中添加了缺少的结束单引号,以及Tomalak的答案中建议的否定以防止回溯。)
在Python 2.x中:
# doesn't work
with open('file', 'r') as f:
for line in f:
# This is broken because it examines a single line of input
print "match" if re.search(r"'[^'$]*\$[^']*'", line)
# works
s = ''
with open('file', 'r') as f:
for line in f:
s += line
# We have collected all the input lines. Now examine them.
print "match" if re.search(r"'[^'$]*\$[^']*'", s)
(这是不在Python中读取整个文件的惯用,高效,正确的方法。我使用笨拙的代码来明显区别。)
现在,更具惯用性,你想要的是什么
perl -0777 -ne 'while (m/\x27[^\x27$]*\$[^\x27]*\x27/g) { print "$&\n" }' file
(\x27
是一个方便,所以我可以将整个脚本放在shell的单引号中,如果你在文件中编写Perl程序,则不是绝对必要的),或者
#!/usr/bin/env python
import re
with open('file', 'r') as f:
for match in re.match(r"'[^'$]*\$[^']*'", f.read()):
print match
类似的逻辑基本上可以应用于任何带有正则表达式引擎的脚本语言,包括sed
。如果您正在使用grep
或其他一些简单的低级正则表达式工具,那么您无法做任何事情来让它一次检查多行(但可能有一些聪明的解决方法,或者您可以简单地切换到另一个工具 - pcregrep
可以作为grep
的常见替代品。{/ p>
如果您有非常大的输入文件,一次将其全部读入内存可能不是一个好主意;也许你可以设计一种只读一次所需的方法来一次执行一次匹配。但这已经超出了这个简单的答案。