Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用egrep的两个正则表达式之间的差异_Regex_Linux_Grep - Fatal编程技术网

Regex 使用egrep的两个正则表达式之间的差异

Regex 使用egrep的两个正则表达式之间的差异,regex,linux,grep,Regex,Linux,Grep,我想知道以下两者之间的区别: sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file 假设文件“some_file”包含以下信息: 08/21/13-01:15:09 foo bar bar and other foo = 11 (61284103) 08/21/13-01:15:11 foo bar number 612841

我想知道以下两者之间的区别:

sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file
sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file
假设文件“some_file”包含以下信息:

08/21/13-01:15:09 foo bar bar and other foo = 11 (61284103)
08/21/13-01:15:11 foo bar number 61284103 another foo

第一个返回两行,但第二行不起作用。

在第一行中,重复所有
08/21/13-
零次或多次。所以它在寻找这样的东西:

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...
08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...
它可以通过匹配
0
次(第一个变量)来匹配两行

第二个匹配
08/21/13
,然后重复0个或多个连字符。所以它在寻找这样的东西:

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...
08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...
但是,没有一个字符串的
08/21/13
仅由
61284103
中的连字符分隔,因此两行都不匹配


如果要使用
*
作为通配符,请改用
*
(它将任意字符重复0次或更多次)。

在第一个字符中,将重复所有
08/21/13-
零次或更多次。所以它在寻找这样的东西:

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...
08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...
它可以通过匹配
0
次(第一个变量)来匹配两行

第二个匹配
08/21/13
,然后重复0个或多个连字符。所以它在寻找这样的东西:

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...
08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...
但是,没有一个字符串的
08/21/13
仅由
61284103
中的连字符分隔,因此两行都不匹配

如果要将
*
用作通配符,请改用
*
(它将任意字符重复0次或更多次)

第一个正则表达式查找0个或多个日期加上连字符的匹配项,而第二个正则表达式则查找一个日期,后跟0个或多个连字符,后跟该数字。我猜这两个正则表达式都不是您想要使用的

你可能想在正则表达式中间使用<代码> *>代码,它允许日期和数字之间的任何文本。不需要括号或

\
转义
-

sudo egrep "08/21/13-.*61284103" /path/to/some_file
第一个正则表达式查找0个或多个日期加上连字符的匹配项,而第二个正则表达式则查找一个日期,后跟0个或多个连字符,后跟该数字。我猜这两个正则表达式都不是您想要使用的

你可能想在正则表达式中间使用<代码> *>代码,它允许日期和数字之间的任何文本。不需要括号或

\
转义
-

sudo egrep "08/21/13-.*61284103" /path/to/some_file
你的第一句话是“意外成功”。事实上,唯一匹配的是
61284103
部分-第一部分在第二部分之前寻找“
08/21/13-
的零个或多个实例”,并且它在那里(零次)。 在第二部分中,您将查找第一个表达式,后面是零个或多个
-
实例,后面是第二个表达式。这是行不通的——中间有“其他东西”

如果实际需要与第一个表达式和第二个表达式匹配的行,则需要使用:

08/21/13.*61284103
这与“精确匹配字符串
08/21/13
,后跟“任何字符的零个或多个实例”(
*
),后跟“精确匹配字符串
61284103
”。这就是你所追求的。

你的第一句话“意外成功”。事实上,唯一匹配的是
61284103
部分-第一部分在第二部分之前寻找“
08/21/13-
的零个或多个实例”,并且它在那里(零次)。 在第二部分中,您将查找第一个表达式,后面是零个或多个
-
实例,后面是第二个表达式。这是行不通的——中间有“其他东西”

如果实际需要与第一个表达式和第二个表达式匹配的行,则需要使用:

08/21/13.*61284103

这与“精确匹配字符串
08/21/13
,后跟“任何字符的零个或多个实例”(
*
),后跟“精确匹配字符串
61284103
”。这正是您所追求的。

通常您只需要在使用
/
作为分隔符的环境中转义它(如Perl、PCRE或JavaScript)-所以在egrep中您不需要。@Floris,您是否有链接了解更多关于egrep中regex的信息?通常您只需要在使用
/
作为分隔符的环境中转义它(像Perl、PCRE或JavaScript)-所以在egrep中你没有。@Floris,你有没有链接来了解egrep中的regex的更多信息?你有没有链接来了解egrep中的regex的更多信息?@ingcarlos不是我想的那么多,但对于简单的事情,应该可以让你加快速度(例如,足以理解你的问题)(特定于味道)主题,我想可以参考手册页。你有链接了解更多关于egrep中regex的信息吗?@ingcarlos不是我脑子里想的,但对于简单的事情,应该可以让你了解最新的情况(例如,足以理解你的问题)。对于更高级的(特定于味道)主题,我想请查阅手册页。@John_Kugelman您有链接了解更多关于egrep中的正则表达式吗?@John_Kugelman您有链接了解egrep中的正则表达式吗?。