Извлечение определенных слов с помощью регулярного выражения

#regex

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

Вопрос:

Я пытался извлечь слова, которые окружены * , из строки, используя регулярные выражения, такие как строка *sample* , из которой я хочу извлечь sample , но я не могу создать правильное регулярное выражение.

Я попробовал следующее регулярное [*]{1}.*[*]{1}, ^[*]{1}.*[*]{1}$? выражение, но оно не работает.

Ответ №1:

Возьмем следующий пример:

 this is a *sample* string, but not *really*
  

В первой захваченной группе будут совпадать следующие sample* string, but not *really :

 *(.*)*
  

В то время как следующее будет соответствовать sample первой захваченной группе:

 *([^*]*)*
  

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

1. Я бы выбрал это. Если ваши регулярные выражения поддерживают стеснительное сопоставление, альтернативной формулировкой для последнего будет *(.*?)* .

Ответ №2:

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

 [*]{1}(.*)[*]{1}
  

Однако это очень многословно. Вы можете просто сделать:

 *(.*)*
  

Вы экранируете * с помощью , потому что это специальный символ.

Ответ №3:

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

 *[^*]**
  

Это означает * : *, [^*]*? 0 или более не-*, * : *

http://gskinner.com/RegExr?2v0e4

Теперь, если вы не хотите «извлекать» * , вы можете сделать это:

 (?:*)([^*]*)(?:*)
  

Это поместит только текст в группу захвата ( ( ) часть) и поместит * в группы без захвата ( (?: ) часть)

Ответ №4:

Вы можете попробовать это регулярное выражение

 (?<=*).*(?=*)
  

Если ваш язык программирования поддерживает поиск сзади и вперед. Если вы хотите сопоставить минимально возможный текст между двумя * s, вы можете использовать отложенный квантификатор следующим образом

 (?<=*).*?(?=*)
  

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

1. Что это будет делать с "*this*that*" или "*this* and *that*" ?

2. @muistoosh Да, это жадный квантификатор, он максимально соответствует двум * с. Также включен ленивый квантификатор, чтобы было понятно.