2016-06-04 5 views
2

Использование регулярных выражений, я пытаюсь соответствовать любой строке символов, которая удовлетворяет следующие условия (в порядке отображения):Regex модели, чтобы соответствовать строке, которая не следует двоеточие

  • содержит знак доллара $ ; затем
  • не менее одной буквы [a-zA-Z]; затем
  • нулевые или более буквы, цифры, символы подчеркивания, периоды (точки), открывающие кронштейны и/или закрывающие скобки [a-zA-Z0-9_.\[\]]*; затем
  • one pipe знак |; затем
  • один на знаке @; затем
  • не менее одной буквы [a-zA-Z]; затем
  • ноль или больше букв, цифр и/или символов подчеркивания [a-zA-Z0-9_]*; Затем
  • нулевой колоны :

Другими словами, если двоеточие находится в конце строки, то он должен не счета в матче.

Вот некоторые примеры правильных матчей:

$tmp1|@hello 
$x2.h|@hi_th3re 
Valid match$here|@in_the middle of other characters 

А вот некоторые примеры недопустимых матчей:

$tmp2|@not_a_match:"because there is a colon" 
$c.4a|@also_no_match: 

Вот некоторые из моделей, которые я пробовал:

(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]*)(\|@)([a-zA-Z][a-zA-Z0-9_]*(?!.[:])) 
(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]+)?(\|@)([a-zA-Z][a-zA-Z0-9_]*(?![:])) 
(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]+)?(\|@)([a-zA-Z][a-zA-Z0-9_]*)([^:]) 
+0

Вы также можете попробовать: [ '\ $ \ ш + [] [\ ш] * \ | @ [^ \ W:.] +'] (Https://regex101.com/r/ iC1sH1/1) может быть недостаточно точным. –

ответ

1

Этот шаблон будет делать то, что вам нужно

\$[A-Za-z]+[\w.\[\]]*[|]@[A-Za-z]+[\w]*+(?!:) 

Regex Demo

Я использую притяжательные кванторы вырубить откаты с помощью [\w]*+. Вы можете также использовать атомные группы вместо притяжательных кванторы как

\$[A-Za-z]+[\w.\[\]]*[|]@[A-Za-z]+(?>[\w]*)(?!:) 

ПРИМЕЧАНИЕ

\ ш => [A-Za-z0-9_]

+0

Проблема с этим заключается в том, что строка может быть или не быть в начале или конце строки. – jerdiggity

+0

@jerdiggity обновлен – rock321987

+0

Отлично, но если я добавлю группу, это повлияет на что-нибудь? – jerdiggity

1

Я проверил ваш третий шаблон в Regex 101 и, по-видимому, работает правильно:

^.*(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]+)?(\|@)([a-zA-Z][a-zA-Z0-9_]*)([^:]).*$ 

Единственное изменение, которое мне нужно было сделать для регулярного выражения, чтобы заставить его работать, было добавить якоря ^ и $ в начало и конец регулярного выражения. Я также допустил, чтобы ваш шаблон выполнялся как подстрока в середине большей строки.

Кстати, вы имели следующий пример в виде строки, которая не должна соответствовать:

$tmp2|@not_a_match:"because there is a colon" 

Однако, даже если убрать двоеточие из этой строки она все равно не совпадают, поскольку она содержит кавычки, которые не допускается.

Regex101

+0

Извините, я только что сделал редактирование с примером допустимой строки, которая находится в середине других. – jerdiggity

+0

@jerdiggity Я обновил свой ответ. Твое третье регулярное выражение было в порядке, ему нужна была небольшая настройка. –

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