两个正则表达式之间的区别:@(samp | code)\ {[^ A-Z] + \}和@(samp | code)\ {[^}] + \}?

时间:2018-11-06 00:35:21

标签: regex regex-group

我是正则表达式的新手。谁能帮我解决这个问题?

我不从事任何项目,只是想学习正则表达式。我从这个网站上找来的:

ftp://ftp.gnu.org/old-gnu/Manuals/gawk-3.0.3/html_chapter/gawk_5.es.html

我已经尝试过在线正则表达式引擎。 Regex101 Regex测试仪等。

  • 情况1->正则表达式为@(samp|code)\{[^A-Z]+\}。文字是 @code{dsadsaad}@samp&dsad}这两个文本是匹配的,但 正则表达式中有\{条件如何?

    https://imgur.com/a/iXUJ2Iy

  • 情况2->正则表达式与@(samp|code)\{[^}]+\}的文本相同。在这 一个,只有第一个符合我的要求-> @code{dsadsaad}

    https://imgur.com/a/Bi8v6IX

\{表示必须为{字符。

相同的表达式\{两者相同,但只有第二个表达式有效。

[^}]表示除}之外的任何内容。[^A-Z]表示除大写字母之外的任何内容。

[^}][^A-Z]如何改变与自己无关的情况?

有人可以解释吗?

1 个答案:

答案 0 :(得分:1)

从我发布的图像中可以最好地看出,您的第一个正则表达式与整个多行文本匹配,而不是每次一行都匹配一行。

我说“尽我所能”,因为当您用awk标记问题时,这与awk无关-您是在问某个在线工具如何根据给定的regexp来解析您的输入,而不是awk是如何做到的,我“我对该工具不熟悉,所以我只是在猜测您发布的图像中的突出显示是什么意思。

如果您想了解正则表达式在awk中的工作方式,请在awk中编写正则表达式,而不要在某些完全不同于awk并支持不同正则表达式变体的在线工具中使用,而解析它的输入与awk不同。例如:

样本输入:

$ cat file
@code{dsadsaad}
@samp&dsad}

预期输出:

record #1, [@code{dsadsaad}]
<@code{dsadsaad}>

record #2, [@samp&dsad}]
no match

实际输出1:

$ awk '
{
    input = "record #" NR ", [" $0 "]"
    if ( match($0,/@(samp|code)\{[^A-Z]+\}/) ) {
        output = "<" substr($0,RSTART,RLENGTH) ">"
    }
    else {
        output = "no match"
    }
    print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}]
<@code{dsadsaad}>

record #2, [@samp&dsad}]
no match

实际输出2:

$ awk '
{
    input = "record #" NR ", [" $0 "]"
    if ( match($0,/@(samp|code)\{[^}]+\}/) ) {
        output = "<" substr($0,RSTART,RLENGTH) ">"
    }
    else {
        output = "no match"
    }
    print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}]
<@code{dsadsaad}>

record #2, [@samp&dsad}]
no match

到目前为止,一切都很好,但是现在通过将RS设置为null并看看我们得到的结果,让awk一次读取整个文件:

实际输出3:

$ awk -v RS= '
{
    input = "record #" NR ", [" $0 "]"
    if ( match($0,/@(samp|code)\{[^A-Z]+\}/) ) {
        output = "<" substr($0,RSTART,RLENGTH) ">"
    }
    else {
        output = "no match"
    }
    print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}
@samp&dsad}
]
<@code{dsadsaad}
@samp&dsad}>

实际输出4:

$ awk -v RS= '
{
    input = "record #" NR ", [" $0 "]"
    if ( match($0,/@(samp|code)\{[^}]+\}/) ) {
        output = "<" substr($0,RSTART,RLENGTH) ">"
    }
    else {
        output = "no match"
    }
    print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}
@samp&dsad}
]
<@code{dsadsaad}>

希望您能看到正则表达式没有问题,它们的行为与预期完全一样,您得到了意想不到的结果,因为您希望输入一次可以处理一行,但是可以在线处理您正在运行的工具显然正在一次处理所有行,这就是正则表达式与多行字符串的不同部分匹配的原因。