регулярное выражение pre и post без или с одним или несколькими пробелами - PullRequest
0 голосов
/ 04 июля 2018

Как написать регулярное выражение для следующих строк, без пробелов или нескольких пробелов ни до, ни после.

"any"
"any4"
"any6"
" any "
" any4 "
" any6 "
"  any  "
"  any4  "
"  any6  "

Я пробовал "any[4,6]{0,1}$", но это работает только с первыми тремя строками.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Причина, по которой первые 3 появляются только потому, что вы используете $ в конце. $ означает, что КОНЕЦ строки является последним введенным символом

так

any[4-6]{0,1}$

будет соответствовать

any4
любой
any6
any4
any6
любой

Если вы хотите найти его с пробелами на обоих концах, просто удалите $.

Если вы пытаетесь найти его на основе определенной строки, где МОЖЕТ появиться пробел используйте

^\s*any[4-6]{0,1}\s*$

Обратите внимание, что регулярные выражения различаются в определенных системах, и этот код может не работать на вашей платформе, так как \s может быть неизвестен и т. Д.

Также обратите внимание, что фактический ПРОБЕЛ, т. Е. ^ [4-6]{0,1} $, может не выполнять правильный поиск, и если он это делает, он будет искать только ПРОБЕЛЫ, а не пробелы, табуляции и т. Д.

Но если вы хотите наверняка включить пробелы, вы можете избежать их, т. Е. ^\ [4-6]{0,1}\ $. В некоторых системах, таких как Linux, пробел в команде заставит ее думать, что это следующая переменная / ввод, и не поймет, что [4-6]{0,1} означает

0 голосов
/ 04 июля 2018

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

\"([a-zA-Z0-9]+)\"
0 голосов
/ 04 июля 2018

RegEx не требуется для этой работы. Вам нужно только

$string -like '*any*'

Кроме того, это быстрее.

0 голосов
/ 04 июля 2018

К соответствует таких строк полностью (пропустите ^ и $ для сопоставления подстроки):

$strings = (
  "any",
  "any4",
  "any6",
  " any ",
  " any4 ",
  " any6 ",
  "  any  ",
  "  any4  ",
  "  any6  "
)

$strings -match '^ *any[46]? *$' # matches all of the above

Чтобы сопоставить и другие формы пробелов, используйте \s вместо .

К извлечь токены с пробелами:

$strings -replace '^ *(any[46]?) *$', '$1' # -> 'any', 'any4', ..., 'any4', 'any6'

(...) образует группу захвата , на которую $1 ссылается в строке замены. См. этот ответ мой для более подробной информации.


Что касается того, что вы пытались:

  • [4,6] - это символ , установленный , что означает, что один входной символ соответствует любому этих символов, , включая ,, это не ваше намерение.

  • Вы используете дублирующий символ (квантификатор) {0,1} правильно (0 или 1 экземпляр предыдущего выражения), но ? - более простая форма той же конструкции (как и * - проще). чем {0,}).

  • Помещая $ (утверждение конца ввода) сразу после {0,1}, вы не учитывали дополнительные конечные пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...