Совпадение буквенно-цифровых слов (не только для цифр), которые имеют уникальные цифры - PullRequest
0 голосов
/ 02 февраля 2019

Используя регулярное выражение, я хочу выбрать только слова , которые:

  • являются буквенно-цифровыми
  • , не содержат только цифры
  • не содержат только алфавиты
  • имеют уникальные числа (1 или более)

Я не очень хорошо разбираюсь в регулярных выражениях, но до сих пор я пытался [^\d\s]*(\d+)(?!.*\1), что ни в коем случае не приближает меня к желаемому результату: (

Вот строки ввода:

I would like abc123 to match but not 123.
ab12s should also match
Only number-words like 1234 should not match
Words containing same numbers like ab22s should not match
234 should not match
hel1lo2haha3hoho4
hel1lo2haha3hoho3

Ожидаемые соответствия:

abc123
ab12s
hel1lo2haha3hoho4

Ответы [ 4 ]

0 голосов
/ 02 февраля 2019

Вы можете использовать это

\b(?!\w*(\d)\w*\1)(?=(?:[a-z]+\d+)|(?:\d+[a-z]+))[a-z0-9]+\b
  • \b - Граница слова.
  • (?!\w*(\d)\w*\1) - Условие проверки уникальных цифр.
  • (?=(?:[a-z]+\d+)|(?:\d+[a-z]+)) - Условие проверки буквенно-цифровых слов.
  • [a-z0-9]+ - Соответствия a to z и 0 to 9

Демонстрация

0 голосов
/ 02 февраля 2019

Вы можете отстаивать все условия, используя один отрицательный прогноз:

\b(?![a-z]+\b|\d+\b|\w*(\d)\w*\1)[a-z\d]+\b

См. живую демонстрацию здесь

Важные части начинаются с \b исразу ищем условия:

  • [a-z]+\b только по буквам

  • \d+\b только по цифрам

  • \w*(\d)\w*\1 Имеет повторяющуюся цифру

0 голосов
/ 02 февраля 2019

Здесь приведено несколько более короткое и быстрое регулярное выражение, поскольку оно не устанавливает отрицательный прогноз для каждого символа:

/\b(?=[a-z]*\d)(?=\d*[a-z])(?!\w*(\d)\w*\1)[a-z\d]+\b/ig

Демонстрация RegEx

Подробности RegEx:

  • \b: граница слова
  • (?=[a-z]*\d): убедитесь, что у нас есть хотя бы цифра
  • (?=\d*[a-z]): Убедитесь, что у нас есть хотя бы буква
  • (?!\w*(\d)\w*\1): убедитесь, что нигде в слове не повторяются цифры
  • [a-z\d]+: соответствуют 1+ буквенно-цифровым цифрам
  • \b: граница слова
0 голосов
/ 02 февраля 2019

Вы можете использовать

\b(?=\d*[a-z])(?=[a-z]*\d)(?:[a-z]|(\d)(?!\w*\1))+\b

https://regex101.com/r/TimjdW/3

Прикрепить начало и конец шаблона на границах слов с помощью \b, затем:

  • (?=\d*[a-z]) - Lookahead для алфавитного символа где-то в слове
  • (?=[a-z]*\d) - Lookahead для цифры где-то в слове
  • (?:[a-z]|(\d)(?!\w*\1))+ Неоднократно совпадать либо с:
    • [a-z] - любой алфавитный символ или
    • (\d)(?!\w*\1) - цифра, которая больше не встречается в одном и том же слове
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...