'.' 之间的区别 ,'?和正则表达式中的“*”?

pos*_*ing 24 bash regex

我能否举例说明这三个元素(这些元素是否称为元字符?)有何不同?

我知道这*意味着全有或全无,但我不确定这是否是正确的思考方式。另一方面.?似乎是一样的。他们匹配一个字符,对吧?

ste*_*ver 35

您可能会将正则表达式shell globs混淆

在正则表达式语法中.表示任何单个字符(通常不包括换行符),而*是一个量词,表示零个或多个前面的正则表达式原子(字符或组)。?是一个量词,表示前一个原子的零个或一个实例,或者(在支持它的正则表达式变体中)一个将量词行为设置为非贪婪的修饰符

在 shell globs 中,?表示单个字符(如 regex 的.)而*表示零个或多个字符的序列(相当于 regex .*)。

您可能会发现有用的一些参考资料是http://www.regular-expressions.info/quickstart.htmlhttp://mywiki.wooledge.org/glob


Ser*_*nyy 20

直接取自维基百科

? 问号表示前一个元素出现零次或一次。例如,colour?r 匹配“颜色”和“颜色”。

*星号表示前一个元素出现零次或多次。例如,ab*c 匹配“ac”、“abc”、“abbc”、“abbbc”等。

最大的区别是星号匹配零次或多次出现,而问号匹配零次或一次出现。比较这两个例子:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur
Run Code Online (Sandbox Code Playgroud)

因为在colouur字母 u(限定符之前的前一个元素?)中出现了不止一次,它没有匹配到?,而是匹配到了*

类似的例子:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror
Run Code Online (Sandbox Code Playgroud)

来自同一维基百科页面:

匹配任何单个字符(许多应用程序不包括换行符,具体哪些字符被视为换行符是特定于风味、字符编码和平台的,但可以安全地假设包含换行符)。在 POSIX 括号表达式中,点字符与文字点匹配。例如,ac 匹配“abc”等,但 [ac] 仅匹配“a”、“.”或“c”。

在我们的例子中,

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur
Run Code Online (Sandbox Code Playgroud)

恰如其分,最后一个读作 match any line that has "colou", plus any character, plus letter "r"

结论

您已经问过:“我知道 '*' 意味着全有或全无,但我不确定这是否是正确的思考方式。另一方面,'.' & '?' 好像一样。” 如您所见,点和星号并不完全相同。点对可能占据该特定位置的任何字符进行操作,而问号对前面的元素进行操作。


Dha*_*ria 7

注意:Examples provided are in Python.虽然概念保持不变。

'.'是一个匹配符号,它匹配除换行符之外的任何字符(这也可以用re.DOTALLPython 中的参数覆盖)。因此它也被称为通配符

'*'是一个量词(定义元素出现的频率)。是{0,} 的缩写。

它的意思是“匹配零个或多个” ——星号之前的组可以在文本中出现任意次数。它可以完全不存在或一遍又一遍地重复。

'?'也是一个量词。是{0,1} 的缩写。

它的意思是“匹配这个问号前面的组中的零个或一个”。也可以理解为问号前面的部分是可选的

例如:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'
Run Code Online (Sandbox Code Playgroud)

在上面的例子中'?' 表示其前面的两位数字是可选的。它们可能不会出现或最多出现一次。

'.' 之间的区别 和 '?':

'.'匹配/接受/验证它在正则表达式中的位置的任何单个字符

例如:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']
Run Code Online (Sandbox Code Playgroud)

'?'匹配/验证它前面的零次或一次出现。

检查手机号码示例。

也一样'*'。它将检查在它之前出现的零次或多次组

组合:

'.*': 接受尽可能多的序列。贪婪的方法

'.*?' 接受第一个匹配的序列并停止。非贪婪方法

有关更多信息,请考虑阅读以下两个问题...