如何解决如何在正则表达式中匹配“ ABC-123”而不是“ XABC-123”
| 我有这个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)
我怎样才能做到这一点?
解决方法
如果
\\b
对您不起作用,您是否尝试过((^| )ABC-[0-9]+)
?
,好像您在寻找\\bABC-[0-9]+
-Word Boundaries。
另一种选择是使用一种具有启发性的lookbedind,这可以让您更好地控制比赛前可以做什么和不能做什么:what7ѭ。
,应该这样做:
^(ABC-[0-9]+)
这样,您就告诉您希望该行以您的正则表达式开头。
,请尝试以下操作:
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 \”之前的字符必须是换行符,或者是字母,数字或下划线以外的任何字符。 \“ 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
,echo \"XABC-123\" | egrep -is \"^ABC-[0-9]+\" && echo \"ok\"
编辑:要接受ABC
,但除字母以外的其他任何内容:
echo \"XABC-123\" | egrep -is \"(^|[^A-Z])ABC-[0-9]+\" && echo \"ok\"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。