正则表达式匹配包含字符的字符串

时间:2014-11-18 06:11:17

标签: regex

我有一个文件,其中包含几个由单引号(')限定的字符串。这些字符串可以包含空格,有时会出现在多行中;但是,没有字符串包含引号(')标记。我想创建一个查找包含字符"$"的字符串的正则表达式。我想到的正则表达式:'[^']*\$[^']*无法搜索多行。我怎么能这样做呢?

2 个答案:

答案 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>

如果您有非常大的输入文件,一次将其全部读入内存可能不是一个好主意;也许你可以设计一种只读一次所需的方法来一次执行一次匹配。但这已经超出了这个简单的答案。