регулярное выражение java: получение подстроки из строки, которая может изменяться

#regex

#регулярное выражение

Вопрос:

У меня есть строка, подобная — "Bangalore,India=Karnataka" . Из этой строки я хотел бы извлечь только подстроку "Bangalore" . В этом случае регулярное выражение может быть — (. ),.*=.* . Но проблема в том, что строка иногда может выглядеть как only "Bangalore" . Тогда в этом случае вышеупомянутое регулярное выражение не будет работать. Каким будет регулярное выражение для получения подстроки "Bangalore" какой бы ни была строка?

Комментарии:

1. Каким образом «Athlone» является подстрокой «Бангалор, Индия = Карнатака»?

2. извините, это было бы «Бангалор». ошибка печати

3. Прежде чем вы узнаете, как написать регулярное выражение, вы должны знать все возможные форматы строк. Не могли бы вы, пожалуйста, перечислить их здесь формально?

Ответ №1:

Попробуйте это:

 ^(. ?)(?:,.*?)?=.*$
  

Объяснение:

 ^               # Begining of the string
  (             # begining of capture group 1
    . ?         # one or more any char non-greedy
  )             # end of group 1
  (?:           # beginig of NON capture group
    ,           # a comma
    .*?         # 0 or more any char non-greedy
  )?            # end of non capture group, optional
  =             # equal sign
  .*            # 0 or more any char
$               # end of string
  

Обновлено:
Я думал, что OP должен соответствовать Bangalore,India=Karnataka or Bangalore=Karnataka , но, насколько я понимаю, это Bangalore,India=Karnataka or Bangalore , поэтому регулярное выражение намного проще :

 ^([^,] )
  

В начале строки будет соответствовать одному или нескольким символам без запятой и они будут объединены в группу 1.

Комментарии:

1. ну, это было то, о чем просил OP 😉

2. Это работает нормально, когда строка «»Бангалор, Индия = Карнатака», но не работает, когда строка только «»Бангалор»

3. @titorcks: Я неправильно понял ваш вопрос. Смотрите мой обновленный ответ.

Ответ №2:

 matcher.matches()
  

пытается сопоставить со всей входной строкой. Посмотрите на javadoc для java.util.regex.Сопоставитель. Вам нужно использовать:

 matcher.find()
  

Ответ №3:

Вы каким-то образом вынуждены решать это, используя одно регулярное выражение и ничего больше? (Глупый вопрос из интервью? Чрезвычайно негибкий внешний API?) В общем, не пытайтесь заставить регулярные выражения делать то, что обычные конструкции старого программирования делают лучше. Просто используйте очевидное регулярное выражение, и если оно не совпадает, верните вместо него всю строку.

Комментарии:

1. Да, на самом деле я должен отправить эту информацию в Java-код, который сопоставит это с информацией, которая у него уже есть, и я вынужден сделать это с помощью регулярного выражения : (

Ответ №4:

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

^.*(?=,)

Комментарии:

1. Это работает нормально, когда строка «»Бангалор, Индия = Карнатака», но не работает, когда строка только «»Бангалор»

2. Итак, позвольте мне прояснить, вам нужно регулярное выражение, которое соответствует ЛЮБОМУ символу и ОПРЕДЕЛЕННОЙ группе символов в ОДНОМ выражении?! То, что вы хотите, логически невозможно для одного и того же выражения.

3. Нет, я всегда хочу, чтобы регулярное выражение соответствовало «Bangalore», но входная строка может быть либо «Бангалор, Индия = Карнатака», либо только «Бангалор»

Ответ №5:

Если вас интересует только проверка того, что «Bangalore» содержится в строке, то для этого вам не нужно регулярное выражение.

Python:

 In [1]: s = 'Bangalorejkdjiefjiojhdu'

In [2]: 'Bangalore' in s
Out[2]: True
  

Комментарии:

1. Мне нужно предоставить эту информацию в Java-коде, и это должно быть сделано с помощью regexp

2. объясните, вам нужно доставить строку «Bangalore», каким образом эта строка отличается при извлечении с помощью regexp из стандартных программных конструкций?