как сопоставить «ABC-123», но не «XABC-123» в регулярном выражении - PullRequest
1 голос
/ 23 мая 2011

У меня есть поиск egrep:

egrep -is "(ABC-[0-9]+)"

, который соответствует ABC-123 в любом месте строки.

Я бы хотел игнорировать XABC-456 или YABC-789.

Другими словами, эти примеры должны выводить "ok":

echo "ABC-123" | egrep -is "(ABC-[0-9]+)" && echo "ok"
echo "test ABC-123" | egrep -is "(ABC-[0-9]+)" && echo "ok"

Но это не должно:

echo "XABC-123" | egrep -is "(<fill in>ABC-[0-9]+)" && echo "ok"

Я попытался без удачи (нетвывод):

echo "ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"

(я использую Solaris 10)

Как я могу это сделать?

Ответы [ 5 ]

4 голосов
/ 23 мая 2011

Похоже, вы ищете \bABC-[0-9]+ - Границы слов .

Другой вариант - использовать отрицательный lookbedind , который дает вам больше контролянад тем, что может и не может быть перед матчем: (?<![a-z])ABC-[0-9]+.

2 голосов
/ 23 мая 2011

Это должно сделать:

^(ABC-[0-9]+)

Таким образом, вы говорите, что хотите, чтобы строка начиналась с вашего регулярного выражения.

1 голос
/ 23 мая 2011

Если \b у вас не работает, вы пробовали ((^| )ABC-[0-9]+)?

1 голос
/ 23 мая 2011

Попробуйте следующее:

echo "XABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"

Есть пара решений, которые предлагают использовать ^ (начинается с ...), однако они потерпят неудачу, если вы посмотрите на «ABC-123», который вы, возможно, захотите поймать. Границы слов, вероятно, то, что вы хотите, если вы ищете, начинается с ...

Вот пример вывода:

tim@Ikura ~
$ echo " ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
 ABC-123
ok

tim@Ikura ~
$ echo "ABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"
ABC-123
ok

tim@Ikura ~
$ echo "XABC-123" | egrep -is "(\bABC-[0-9]+)" && echo "ok"

tim@Ikura ~
$

Обновление: Проблемы с Solaris ... "Поиск слова не так прост, как кажется на первый взгляд. Строка" the "будет соответствовать слову" other ". Вы можете поставить пробелы до и после букв и используйте это регулярное выражение: «the». Однако это не соответствует словам в начале или конце строки. И это не соответствует случаю, когда после слова стоит знак препинания.

Существует простое решение. Символы "\ <" и ">" аналогичны якорям "^" и "$", так как они не занимают позицию символа. Они делают «привязку» выражения между, чтобы соответствовать, только если оно находится на границе слова. Шаблон для поиска слова "the" будет "\ <[tT] he>". Символ перед «t» должен быть либо символом новой строки, либо чем-либо, кроме буквы, цифры или подчеркивания. Символ после «е» также должен быть символом, отличным от цифры, буквы или подчеркивания, или это может быть символ конца строки. "

tim@Ikura ~
$ echo "XABC-123" | egrep -is "(\<ABC-[0-9]+\>)" && echo "ok"

tim@Ikura ~
$ echo " ABC-123" | egrep -is "(\<ABC-[0-9]+\>)" && echo "ok"
 ABC-123
ok
0 голосов
/ 23 мая 2011
echo "XABC-123" | egrep -is "^ABC-[0-9]+" && echo "ok"

РЕДАКТИРОВАТЬ: принять ABC, когда ему предшествует что-либо, кроме буквы:

echo "XABC-123" | egrep -is "(^|[^A-Z])ABC-[0-9]+" && echo "ok"
...