我想知道为什么在这种情况下我没有得到结果:
echo "This doesn't work." | grep -E '[[:upper:]]([[:upper:]] | [[:lower:]])*\.'
我正在 Grep 中学习正则表达式,我在这里想做的是检测输入是否是一个句子。为此,我使用带有扩展选项的 grep 并尝试匹配以大写字母开头、后跟任意数量的大写和小写字母并以句点结尾的任何输入。问题是输入不匹配,我不明白为什么。
这是工作示例:
echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
还有我们为什么需要?在关闭之前第二个括号扩展中 [:lower:] 后面的空格?为什么需要它才能工作?
答案1
您的表达基本上有两个“错误”。首先,您不允许匹配'
.其次,([[:upper:]] | [[:lower:]])*
将匹配类似 的字符串A A a a
,即大写字母后跟空格的序列,或小写字母前跟空格的序列。
匹配 string 需要什么This doesn't work.
,显式匹配大写T
和点,以及匹配大写、小写、空格和'
中间的内容:
$ echo "This doesn't work." | grep -E "[[:upper:]]([[:upper:]]| |'|[[:lower:]])*\."
This doesn't work.
这更好地写成
$ echo "This doesn't work." | grep "[[:upper:]][[:upper:][:lower:]' ]*\."
This doesn't work.
(即使[:upper:]
在本例中第二个实际上不是由测试字符串触发的;我们可以使用[[:upper:]][[:lower:]' ]*\.
)
括号表达式内的空格允许匹配文本中的实际空格。如果没有该空格,模式将不匹配(测试字符串中有两个空格)。这也是我'
在其中包含该字符的原因,因为显然您想要匹配包含这些字符的文本。
答案2
你的第一个例子:
您正在寻找一个大写字符,后跟任意数量的大写或小写字符,重复零次到无限次。但是,您的句子包含空格和标点符号 ( '
)。正则表达式非常强大,但我认为它不是您想要实现的目标的正确工具。对于初学者来说,句子可以以各种标点符号结尾。此外,句子可以包含的字符实际上没有任何限制。
我相信是 Stéphane 说你应该始终在 rm 中使用“--”!
这不就是一句话吗?
您在第二个示例中需要空格的原因与您的第一个示例不起作用的原因相同......您的句子中有一个空格。
你可能会使用这样的东西:
[A-Z](\s|\S)+[.!?]
然而,它只是匹配以大写(英语)字符开头并以标点符号结尾的任何内容,而不真正考虑中间的任何内容。
另外,像下面这样的句子又如何呢?
iTunes 是我最不喜欢的音乐播放器。