我是正则表达式的新手。谁能帮我解决这个问题?
我不从事任何项目,只是想学习正则表达式。我从这个网站上找来的:
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}
这两个文本是匹配的,但
正则表达式中有\{
条件如何?
情况2->正则表达式与@(samp|code)\{[^}]+\}
的文本相同。在这
一个,只有第一个符合我的要求-> @code{dsadsaad}
\{
表示必须为{
字符。
相同的表达式\{
两者相同,但只有第二个表达式有效。
[^}]
表示除}
之外的任何内容。[^A-Z]
表示除大写字母之外的任何内容。
[^}]
和[^A-Z]
如何改变与自己无关的情况?
有人可以解释吗?
答案 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}>
希望您能看到正则表达式没有问题,它们的行为与预期完全一样,您得到了意想不到的结果,因为您希望输入一次可以处理一行,但是可以在线处理您正在运行的工具显然正在一次处理所有行,这就是正则表达式与多行字符串的不同部分匹配的原因。