используя регулярное выражение для поиска подстроки - PullRequest
1 голос
/ 25 октября 2019

У меня проблема с использованием регулярных выражений. Я использую следующее регулярное выражение:

\\S*the[^o\\s]*(?<!theo)\\b

Я использую следующее предложение:

Если мир скажет, что theo - это не oreo cookie, то theatheoder theotatheder thetheheder очень хорош.

То, что я хочу получить от вывода, - это иметь шаблоны: затем, thetheheder, extratheaterly?

Короче, я согласен с '() Как полная строка или подстрока в строке, которая не содержит «theo».

Как я могу изменить свое регулярное выражение для достижения этой цели? То, что я думаю, это применить, операция трубы или вопросительный знак. Но ни одно из них не представляется возможным.

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Вы можете использовать \S в отрицательном взгляде в качестве начальной границы и в отрицательном взгляде, чтобы убедиться, что слово не содержит theo.

Чтобы соответствовать или, вы можете сделать шаблон нечувствительным к регистру. .

(?<!\S)(?!\S*theo\S*)\S*the\S*

По частям

  • (?<!\S) Отрицательный взгляд сзади, утверждение, что слева, не является символом без пробелов
  • (?!\S*theo\S*) Отрицательный взгляд вперед, подтвердите, что то, что справа, не содержит theo
  • \S*the\S* Соответствие the, окруженное совпадением 0+ раз непробельного символа

Regex demo

Если вы используете только символы слов, вы также можете использовать границы слов \b

\b(?!\w*theo\w*)\w*the\w*\b

Regex demo

Или вы можете утверждать, что часть слова равна the, и сопоставить ее, используя утверждение, что если вы соответствуете t, за ним не должно следовать heo

\b(?=\S*the\S*)[^t\s]*(?:t(?!heo)[^t\s]*)+\b

Regex demo

0 голосов
/ 25 октября 2019
\b[A-Za-z]*he([a-z](?<!theo))*\b

соответствует, тогда, вне театра

\ b граница слова

[A-Za-z] соответствует любой букве

[az] соответствует любой строчнойбуква

* соответствует 0 или более

([a-z](?<!theo))*

Это сложная часть. На нем написано любая буква, убедитесь, что после добавления этой буквы

посмотрите, не написано ли оно (оглядываясь назад). Посмотрите на отрицательный взгляд назад и отрицательный взгляд.

0 голосов
/ 25 октября 2019

Generic

Если вы хотите создать общее выражение, возможно, вы можете начать с некоторого выражения, похожего на

\S*the[^o\s]*\b

, в зависимости от того, что вы хотите сопоставить и не сопоставить, Я полагаю.

Демонстрация

Неуниверсальный

Я думаю, вы можете просто найти границы слов (\b), полезные для решения вашей проблемы, с некоторыми простымивыражение, подобное,

\b[Tt]he\b|\b[Tt]hen\b|\bextratheaterly\b

Демо 1

Или,

\b(?:[Tt]hen?|[Ee]xtratheaterly)\b

Демо 2

Java Test

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\b(?:[Tt]hen?|[Ee]xtratheaterly)\\b";
        final String string = "If the world says that theo is not oreo cookies then thetatheoder is extratheaterly good.\n\n"
             + "If The world says that theo is not oreo cookies Then thetatheoder is Extratheaterly good.\n\n"
             + "If notthe world says that theo is not oreo cookies notthen thetatheoder is notextratheaterly good.\n\n\n";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

Выход

Full match: the
Full match: then
Full match: extratheaterly
Full match: The
Full match: Then
Full match: Extratheaterly

Python Test

import re
string = '''
If the world says that theo is not oreo cookies then thetatheoder is extratheaterly good.

If The world says that theo is not oreo cookies Then thetatheoder is Extratheaterly good.

If notthe world says that theo is not oreo cookies notthen thetatheoder is notextratheaterly good.
'''

expression = r'\b(?:[Tt]hen?|[Ee]xtratheaterly)\b'

print(re.findall(expression, string))
print([m.group(0) for m in re.finditer(expression, string)])

Выход

['the', 'then', 'extratheaterly', 'The', 'Then', 'Extratheaterly']
['the', 'then', 'extratheaterly', 'The', 'Then', 'Extratheaterly']

Если вы хотитечтобы упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . При желании вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...