Regex - найти все фразы, кроме той, которая включает в себя определенное слово - PullRequest
1 голос
/ 18 марта 2010

У меня есть текстовый файл с текстом вроде:

"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 ]

1 голос
/ 18 марта 2010

Вы можете, но это не красиво, и это будет лот менее эффективным, чем просто захват всех предложений и проверка их на «другое» впоследствии. Если нет абсолютно, безусловно, способа, которым вы не можете исключить «что-либо еще» до или после, я призываю вас пересмотреть то, как вы подходите к проблеме.

Отказ от ответственности, быстрый тест показывает, /(?:^|\.\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]);

Производит:

<code>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"
}
0 голосов
/ 18 марта 2010

Это проще, если вы инвертируете свой подход: вместо построения регулярных выражений совпадающих строк, которые не содержат «else», создайте одну совпадающую строку, которая do содержит «else» ( как предложил sgreeve ), затем выберите строки, которые не соответствуют.

0 голосов
/ 18 марта 2010
sed 's/\(.[^.]*\)\./&\n/g;s/.*else.*//g' textfile
0 голосов
/ 18 марта 2010

если вы используете 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
"
0 голосов
/ 18 марта 2010

Да, вы можете использовать регулярное выражение для сопоставления строк, содержащих "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));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...