Как создать регулярное выражение, которое соответствует тексту только с открытой круглой скобкой без пробела? - PullRequest
2 голосов
/ 12 июля 2020

Как создать регулярное выражение с группой, которая включает текст с открытой круглой скобкой без пробела, но не включает открытую скобку, перед которой стоит пробел (и все после него)?

Некоторые примеры:

Соответствие: "Yasmani Grandal (1B 1.84)" Вернется: «Ясмани Грандал»

Соответствие: «JT Realmuto» Вернет: «JT Realmuto»

Соответствие: «Уилл Д. Смит (LAD)» Вернется: «Уилл Д. Смит (LAD)»

Соответствие: «Адли (раунд / 1/2019) Рутчман» Вернет: «Адлей (раунд / 1/2019) Рутчман»

Попытки решения:

(.+)(?:\s\(.*)

Это регулярное выражение возвращает «Ясмани Грандаль» как группу 1 при сопоставлении "Yasmani Grandal (1B 1.84)", но не соответствует "JT Realmuto", потому что вторая (несоответствующая) группа не является необязательной.

Но если я сделаю ее необязательной: (.+)(?:\s\(.*)?

... тогда группа 1 при сопоставлении «Ясмани Грандал (1Б 1.84)» будет «Ясмани Грандал (1Б 1.84)».

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Вы можете использовать

^(.*?)(?:\s+\(.*\))?$

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • (.*?) - Группа захвата 1: любые 0 или более символов, кроме символов разрыва строки, как можно меньше
  • (?:\s+\(.*\))? - необязательная группа без захвата, соответствующая 1 или 0 вхождений
    • \s+ - 1+ пробелов
    • \( - a ( char
    • .* - любые 0 или более символов, кроме строки разбивать символы на максимальное количество
    • \) - a ) char
  • $ - конец строки.
1 голос
/ 13 июля 2020

Вы можете использовать следующее регулярное выражение для преобразования совпадений в пустые строки. (Я избежал начального пробела просто для удобства чтения.)

\ +\((?!.* \)).*

Преобразованная строка, вероятно, является тем, что вы хотите, поэтому, похоже, нет смысла сохранять ее в группе захвата. Если вам нужно захватить часть строки, которая преобразована в пустую строку, замените .* на (.*).

Поскольку это регулярное выражение больше не содержит exoti c, положительный просмотр вперед должен работать с большинством механизмов регулярных выражений.

Запустите свой механизм!

Механизм регулярных выражений выполняет следующие операции.

\ +        : match 1+ spaces
\(         : match '('
(?!.* \))  : use a negative lookahead to assert the remainder of
             the line does contain the string ' )'`
.*         : match 0+ characters other than line terminators

Я предполагал, что вы хотите чтобы удалить все пробелы перед левой круглой скобкой, перед которой стоит хотя бы один пробел. Если, например, строка была:

Yasmani Grandal      (1B 1.84)
               ^^^^^^^^^^^^^^^

, часть, обозначенная шляпами для вечеринок, была бы преобразована в пустую строку.

0 голосов
/ 12 июля 2020

Можете ли вы попробовать это и сообщить мне, работает ли это?

(.+)\s\(.*

public class HelloWorld{

     public static void main(String []args){
        String[] names = new String[] {"Yasmani Grandal (1B 1.84)","J.T. Realmuto","WillD. Smith(LAD)","Adley(round/1/2019) Rutschman"};
        
        for (String in : names)
        System.out.println(in.replaceAll("(.+)\\s\\(.*","$1"));
     }
}

Обратите внимание, я написал минимальное выражение для этого. Вы можете расширить его в соответствии с вашими дополнительными требованиями. Приведенный выше код работает нормально.

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