我有一个文本文件,其中包含以下文字:
"Lorem ipsum text. Second lorem ipsum. How are You. It's
ok. Done. Something else now.
New line. Halo. Text. Are You ok."
我需要一个正则表达式来查找所有句子(.
之间),除了其中包含“else”一词的句子。我正在尝试许多正则表达式模式,但没有任何作用。
我可以使用正则表达式吗?
答案 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
将匹配这些句子:
// note the full stop
......但不是这个......
你没有说你正在编写哪种语言,但这里是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 ),然后选择不匹配的行。