如何在正则表达式中匹配“ABC-123”而不是“XABC-123”

时间:2011-05-23 08:25:06

标签: regex solaris grep

我有这个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 个答案:

答案 0 :(得分:4)

看起来您正在寻找\bABC-[0-9]+ - Word Boundaries

另一种选择是使用negetive lookbedind,whci可让您更好地控制匹配前可以和不可以的内容:(?<![a-z])ABC-[0-9]+

答案 1 :(得分:2)

这应该做:

^(ABC-[0-9]+)

通过这种方式,您告诉您希望该行以正则表达式开头。

答案 2 :(得分:1)

尝试以下方法:

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”。但是,这与行的开头或结尾处的单词不匹配。并且它与单词后面有标点符号的情况不匹配。< / p>

有一个简单的解决方案。字符“\&lt;”和“&gt;”类似于“^”和“$”锚点,因为它们不占据角色的位置。它们确实“锚定”它们之间的表达式,只有当它在单词边界上时才匹配。搜索单词“the”的模式将是“\&lt; [tT] he&gt;”。 “t”之前的字符必须是新行字符,或除字母,数字或下划线之外的任何字符。 “e”后面的字符也必须是数字,字母或下划线以外的字符,或者它可以是行尾字符。“

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

答案 3 :(得分:1)

如果\b不适合您,您是否尝试过((^| )ABC-[0-9]+)

答案 4 :(得分:0)

echo "XABC-123" | egrep -is "^ABC-[0-9]+" && echo "ok"

编辑:接受ABC除了字母之前的任何内容时:

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