首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BASH正则表达式{}混淆

BASH正则表达式{}混淆
EN

Stack Overflow用户
提问于 2013-08-14 20:56:31
回答 4查看 1.6K关注 0票数 3

我想我对{3,5}部分是如何工作的有错误的理解。

据我所知,它是指定一个范围,数字必须遵守返回一个搜索结果?

例如,3,5意味着返回搜索的3到5位数字。经过一些实验,我意识到我的逻辑不完全正确。

它似乎适用于3-5个字符,然后是8,9和10个字符.

我是不是漏掉了一个图案?或者更简单的说,有人能给我解释一下背后的逻辑吗?它是3的倍数还是5的倍数?包括3-5的范围?在这里真的很困惑。谢谢!

user@matrix:~> echo 1234567891234 \ grep '0-9{3,5}‘ 1234567891234

以上匹配成功,包含12个字符.

EN

回答 4

Stack Overflow用户

发布于 2013-08-14 21:00:08

您可以使用-o选项来可视化grep的工作方式:

代码语言:javascript
运行
复制
echo 1234567891234 | grep -o '[0-9]\{3,5\}'

输出:

代码语言:javascript
运行
复制
12345
67891
234

-o将在每次匹配后添加一个新行到输出。如果没有该选项,grep将只打印匹配(Es)发生的整行--输入字符串本身将是什么。这样,您将无法看到grep如何准确地匹配字符串。

但是现在您可以看到grep在该行中找到了多个匹配项,其中2次是5位字符串,1次是3位字符串。

此外,除非您使用的是{}选项,否则需要在-E括号前面使用斜杠。

票数 2
EN

Stack Overflow用户

发布于 2013-08-14 21:05:36

您正确的假设是{3,5}定义了在它前面的类中选择的字符的重复--在3到5之间(都包括)重复。你也可以做一些类似{3,}的事情,意思是“至少3次”。

使用-Ex选项,E -这样您就不必在括号和x之前使用斜杠来处理整个行:

代码语言:javascript
运行
复制
[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,5}'
[alfasin@otrs ~]$ echo 1234567891234 | grep -Ex '[0-9]{3,13}'
1234567891234

来自grep手册:

-E,- extended将模式解释为扩展正则表达式(ERE,见下文)。(-E由POSIX.) -x,- line -regexp只选择与整行完全匹配的匹配项。(-x由POSIX.)

票数 2
EN

Stack Overflow用户

发布于 2013-08-14 21:37:31

它和你写的一模一样:

代码语言:javascript
运行
复制
grep '[0-9]\{3,5\}'  - Is there 3 to 5 sequential numeric characters in this string?

如果字符串是1234567891234,则其中有一个包含3-5个数字字符的子字符串.

如果您只对只包含3-5个数字字符且不超过5个字符的字符串感兴趣,则必须在正则表达式中设置一些边界。您还应该使用-E标志,它使用更现代版本的正则表达式:

代码语言:javascript
运行
复制
$ echo 12345678901234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

这将不会打印任何内容,但这将:

代码语言:javascript
运行
复制
$ echo 1234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

这是:

代码语言:javascript
运行
复制
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

第一个(^|[^0-9])表示行的开头(这是最前面的^),或者除字符0-9以外的任何内容。(这是[^0-9])。在扩展正则表达式中使用(...|...)意味着左边的表达式或右边的表达式。这同样适用于结尾的([^0-9]|$),它要么表示非数字,要么表示行尾。

中间是[0-9]{3,5} (扩展表达式不需要反斜杠)。这个数字在3到5位之间。而且,由于它被非数字绑定在两边,或者字符串的开始或结束,这将做你想做的事情。

几件事:

代码语言:javascript
运行
复制
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"

代码语言:javascript
运行
复制
$ grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)" <<<"12345aaa6789aaa01234"

意味着几乎一样的事情。然而,第二个更有效,因为只有一个进程必须运行,而且没有管道。另外,打字的时间更短。

此外,您还可以使用字符类(并且它是首选的):

$ grep -E -E

这将允许您的正则表达式工作,即使您不在一个地方使用拉丁字母数字字符。这是一种更短的方法,因为\d[:digit:]是同一个类。

代码语言:javascript
运行
复制
$ grep -E "(^|[^\d])\d{3,5}([^\d]|$)"<<<"12345aaa6789aaa01234"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18242143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档