Regex для распознавания слов и тех, которые имеют апостроф

Обновление: Согласно комментариям относительно неоднозначности моего вопроса, я увеличил деталь в вопросе.

(Терминология: словами я обращаюсь к любой последовательности алфавитно-цифровых символов.)

Я ищу regex для соответствия следующему, дословно:

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

Я хотел бы соответствовать следующему, однако не дословно, скорее удаляя апострофы:

  • Слова с апострофом вначале и в конце были бы распознаны к слову без апострофов. Так 'foo' был бы подобран к foo.
  • Слова больше чем с одним непрерывным апострофом в середине были бы разрешены к двум различным словам: фрагмент перед непрерывными апострофами и фрагментом после непрерывных апострофов. Так, foo''bar был бы подобран к foo и bar.
  • Слова больше чем с одним непрерывным апострофом вначале или в конце были бы распознаны к слову без апострофов. Так, ''foo был бы подобран к foo и ''foo'' кому: foo.

Примеры Они были бы подобраны дословно:

  • 'bout
  • it's
  • persons'

Но они были бы проигнорированы:

  • '
  • ''

И, для 'open', open был бы подобран.

12
задан Humphrey Bogart 8 April 2010 в 01:31
поделиться

5 ответов

Как насчет этого?

'?\b[0-9A-Za-z']+\b'?

РЕДАКТИРОВАТЬ: предыдущая версия не включает апострофы по бокам.

1
ответ дан 2 December 2019 в 06:08
поделиться

Попробуйте использовать это:

(? =. * \ W) ^ (\ w | ') + $

'bout     # pass
it's      # pass
persons'  # pass
'         # fail
''        # fail

Regex Explanation

NODE      EXPLANATION
  (?=       look ahead to see if there is:
    .*        any character except \n (0 or more times
              (matching the most amount possible))
    \w        word characters (a-z, A-Z, 0-9, _)
  )         end of look-ahead
  ^         the beginning of the string
  (         group and capture to \1 (1 or more times
            (matching the most amount possible)):
    \w        word characters (a-z, A-Z, 0-9, _)
   |         OR
    '         '\''
  )+        end of \1 (NOTE: because you're using a
            quantifier on this capture, only the LAST
            repetition of the captured pattern will be
            stored in \1)
  $         before an optional \n, and the end of the
            string
21
ответ дан 2 December 2019 в 06:08
поделиться
/('\w+)|(\w+'\w+)|(\w+')|(\w+)/
  • '\ w + Соответствует', за которым следует один или несколько буквенных символов, ИЛИ
  • \ w + '\ w + Соответствует одному или нескольким буквенным символам, за которыми следует', за которым следует один или несколько буквенных символов, ИЛИ
  • \ w + ' Соответствует одному или нескольким буквенным символам, за которыми следует'
  • \ w + Соответствует одному или нескольким буквенным символам
3
ответ дан 2 December 2019 в 06:08
поделиться

Это отлично работает

 ('*)(?:'')*('?(?:\w+'?)+\w+('\b|'?[^']))(\1)

с этими данными без проблем

    'bou
    it's
    persons'
    'open'
    open
    foo''bar
    ''foo
    bee''
    ''foo''
    '
    ''

с этими данными вы должны удалить результат (удалить пробелы из совпадений)

    'bou it's persons' 'open' open foo''bar ''foo ''foo'' ' ''

(протестировано в The Regulator, результат - 2 доллара)

{{1} }
0
ответ дан 2 December 2019 в 06:08
поделиться

Я отправил этот второй ответ, потому что похоже, что вопрос немного изменился, и мой предыдущий ответ больше не действителен. В любом случае, если перечислены все условия, попробуйте следующее:

(((?<!')')?\b[0-9A-Za-z]+\b('(?!'))?|\b[0-9A-Za-z]+('[0-9A-Za-z]+)*\b)
0
ответ дан 2 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: