2015-08-10 3 views
4

Я искал регулярное выражение для соответствия словам с дефисами и/или апострофами. До сих пор у меня есть:Regex для соответствия словам с дефисами и/или апострофами

(\w+([-'])(\w+)?[']?(\w+)) 

и работает большую часть времени, хотя, если есть апостроф, а затем дефис, как «qu'est-се», он не соответствует. Я мог бы добавить дополнительные опции, хотя, возможно, есть еще один более эффективный способ?

Некоторые примеры того, что я пытаюсь совместить: Мэри, Высшая школа, 'tis, Chambers', Qu'est-ce.

+0

Посмотрите на него снова, (\ w + ([- ']) (\ w +)? [-']? (\ W +)) будет работать для того, что мне нужно большую часть времени, хотя мне все еще интересно, есть ли другой способ , – empedocle

+0

Просьба привести больше примеров и встречных примеров. Какое из следующего должно соответствовать: '" -a ",' "'',' "a'-b" ',' "a-" '? –

+0

@torazaburo Нет необходимости в математике, но в значительной степени любое слово, которое может появиться на любом европейском языке. Я могу добавить символы по мере необходимости. – empedocle

ответ

10

использовать этот шаблон

(?=\S*['-])([a-zA-Z'-]+) 

Demo

(?=     # Look-Ahead 
    \S    # <not a whitespace character> 
    *     # (zero or more)(greedy) 
    ['-]    # Character in ['-] Character Class 
)     # End of Look-Ahead 
(     # Capturing Group (1) 
    [a-zA-Z'-]  # Character in [a-zA-Z'-] Character Class 
    +     # (one or more)(greedy) 
)     # End of Capturing Group (1) 
+0

Я не знал, что выглядит, и это кажется хорошим. Объяснение было бы неплохо. :) Но я могу прочитать об этом. Возможно, это единственный гарантированный шаблон, который всегда будет соответствовать. – empedocle

+0

@empedocle, добавлено объяснение –

+0

Спасибо. Я также нашел полезное объяснение в представлении регулярных выражений. – empedocle

0

Как насчет: \'?\w+([-']\w+)*\'?

demo

Я полагаю, эти слова не должны совпадать:

  • something- или -something: начинаться или заканчиваться -
  • some--thing или some'-thing: - за которым не следует символ
  • some'': два дефиса
+0

добавил несколько примеров. – empedocle

1

[\w'-]+ будет соответствовать почти любому вхождению слов с (или без) дефисами и апострофами, но также и в тех случаях, когда эти символы смежны. (?:\w|['-]\w)+ должен соответствовать случаям, когда символы не могут быть смежными.

Если вам нужно быть уверенным, что слово содержит дефисы и/или апострофы и что эти символы не смежны, попробуйте \w*(?:['-](?!['-])\w*)+. Но это также будет соответствовать «и - одному».

0

Проблема, с которой вы сталкиваетесь, состоит в том, что на самом деле у вас есть три возможных подматрицы: один или несколько символов, апостроф, сопровождаемый одним или несколькими символами, и дефис, сопровождаемый одним или несколькими символами.

Это предполагает, что вы не хотите принимать слова, которые начинаются или заканчиваются апострофами или дефисами или имеют дефисы рядом с апострофами (или наоборот).

Я считаю, что лучший способ представить это в RegExp будет:

/\ Ь [аз] + (?:? [ '-] [аз] +) * \ б/

который описан как:

\b     # word-break 
[a-z]+    # one or more 
(?:     # start non-matching group 
    ['-]?    # zero or one 
    [a-z]+    # one or more 
)*     # end of non-matching group, zero or more 
\b     # word-break 

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

+0

Мой отредактированный вопрос, я думаю, изменился, прежде чем вы ответили, включили примеры, такие как «tis и Chambers». Lookahead, из другого ответа, похоже, что он поймает все случаи, так как я пытаюсь сопоставить любое слово, которое может произойти на английском языке, включая случаи, о которых я еще не думал. – empedocle

Смежные вопросы