正则表达式 - 查找除包含特定单词的短语以外的所有短语

时间:2010-03-17 23:56:36

标签: regex

我有一个文本文件,其中包含以下文字:

"Lorem ipsum text. Second lorem ipsum. How are You. It's 
ok. Done. Something else now.

New line. Halo. Text. Are You ok."

我需要一个正则表达式来查找所有句子(.之间),除了其中包含“else”一词的句子。我正在尝试许多正则表达式模式,但没有任何作用。

我可以使用正则表达式吗?

5 个答案:

答案 0 :(得分:1)

你可以,但它并不漂亮,并且它会比仅仅抓住所有句子并在之后为'其他'测试它们的效率很多。除非有绝对的,否则你不能在之前或之后排除'其他',我会敦促你重新考虑你是如何处理这个问题的。

除了免责声明,快速测试显示/(?:^|\.\s+)(([^\.](?!else))+)(?=\.)/im有效。假设它的效率非常低效。

PHP中的快速测试脚本:

$re = '/(?:^|\.\s+)(([^\.](?!else))+)(?=\.)/im';

$input = "Lorem ipsum text. Second lorem ipsum. How are You. It's ok. Done. Somthing else now.

New line. Halo. Text. Are You ok.";

preg_match_all($re, $input, $m); var_dump($m[1]);

产地:

array(9) {
  [0]=> string(16) "Lorem ipsum text"
  [1]=> string(18) "Second lorem ipsum"
  [2]=> string(11) "How are You"
  [3]=> string(7) "It's ok"
  [4]=> string(4) "Done"
  [5]=> string(8) "New line"
  [6]=> string(4) "Halo"
  [7]=> string(4) "Text"
  [8]=> string(10) "Are You ok"
}

答案 1 :(得分:0)

是的,你可以使用正则表达式来非常容易地匹配包含“else”的字符串。表达非常简单:

\belse\b

表达式两端的\b表示“单词边界”,这意味着表达式只匹配整个单词else,并且在else成为一部分时不匹配另一个字。但是请注意,单词边界不会继续使用标点字符,如果您正在解析句子,这很有用。

因此表达式\belse\b将匹配这些句子:

  • Blah blah else blah
  • 别的blah blah blah
  • blah blah blah else
  • 等等等等。 // note the full stop

......但不是这个......

  • blah blahelse blah

你没有说你正在编写哪种语言,但这里是C#中的一个简单例子,使用System.Text.RegularExpressions.Regex类并编写为NUnit测试:

        [Test]
        public void regexTest()
        {
            // This test passes

            String test1 = "This is a sentence which contains the word else";
            String test2 = "This is a sentence which does not";
            String test3 = "Blah blah else blah blah";
            String test4 = "This is a sentence which contains the word else.";

            Regex regex = new Regex("\\belse\\b");
            Assert.True(regex.IsMatch(test1));
            Assert.False(regex.IsMatch(test2));
            Assert.True(regex.IsMatch(test3));
            Assert.True(regex.IsMatch(test4));
        }

答案 2 :(得分:0)

如果您使用的是unix,则可以使用awk。

$ awk -vRS="." '!/else/' file
"Lorem ipsum text
 Second lorem ipsum
 How are You
 It's
ok
 Done


New line
 Halo
 Text
 Are You ok
"

答案 3 :(得分:0)

sed 's/\(.[^.]*\)\./&\n/g;s/.*else.*//g' textfile

答案 4 :(得分:0)

如果你颠倒你的方法,这会更容易:不是构建一个不包含“else”的正则表达式匹配行,而是创建一个包含“else”的匹配行(like sgreeve suggested ),然后选择不匹配的行。