Regex соответствует словам и словам с апострофом

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

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

Я ищу регулярное выражение, чтобы соответствовать следующему, дословно:

  • Слова.
  • Слова с одним апострофом в начале.
  • Слова с любым числом несмежных апострофов по всей середине.
  • Слова с одним апострофом в конце.

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

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

<сильные > Примеры Они будут сопоставляться дословно:

  • 'bout
  • it's
  • persons'

Но они будут проигнорированы:

  • '
  • ''

И, для 'open', open будет сопоставлено.

Ответ 1

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

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

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

Регулярное выражение Пояснение

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

Ответ 2

/('\w+)|(\w+'\w+)|(\w+')|(\w+)/
  • '\ w + Соответствует a', за которым следует один или несколько альфа-символов, OR
  • \w + '\ w + Matche sone или более альфа-символов, за которым следует символ', сопровождаемый одним или несколькими альфа-символами, OR
  • \w + ' Соответствует одному или нескольким альфа-символам, за которыми следует'
  • \w + Соответствует одному или нескольким альфа-символам

Ответ 3

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

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

EDIT: предыдущая версия не включает апострофы по бокам.

Ответ 4

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

(((?<!')')?\b[0-9A-Za-z]+\b('(?!'))?|\b[0-9A-Za-z]+('[0-9A-Za-z]+)*\b)

Ответ 5

Это прекрасно работает

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

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

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

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

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

(тестируется в регуляторе, получается $2)