两个正则表达式之间的区别:@(samp|code)\{[^A-Z]+\} 和@(samp|code)\{[^}]+\}?
Difference between two regex: @(samp|code)\{[^A-Z]+\} and @(samp|code)\{[^}]+\}?
我是正则表达式的新手。谁能帮我解决一下?
我没有从事任何项目,只是想学习正则表达式。我是从这个网站看的:
ftp://ftp.gnu.org/old-gnu/Manuals/gawk-3.0.3/html_chapter/gawk_5.es.html
我已经尝试过在线正则表达式引擎。 Regex101 正则表达式测试器等
案例 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]
如何改变与自己无关的情况?
谁能解释一下?
我从您发布的图片中可以看出,您的第一个正则表达式匹配整个多行文本,而不是一次一行匹配每一行。
我说 "best I can tell" 因为当你用 awk 标记你的问题时这与 awk 无关 - 你问的是一些在线工具如何根据你的正则表达式解析你的输入,而不是 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 ", [" [=12=] "]"
if ( match([=12=],/@(samp|code)\{[^A-Z]+\}/) ) {
output = "<" substr([=12=],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 ", [" [=13=] "]"
if ( match([=13=],/@(samp|code)\{[^}]+\}/) ) {
output = "<" substr([=13=],RSTART,RLENGTH) ">"
}
else {
output = "no match"
}
print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}]
<@code{dsadsaad}>
record #2, [@samp&dsad}]
no match
到目前为止一切都很好,但现在让 awk 通过将 RS 设置为 null 来一次读取整个文件,看看我们得到了什么:
实际输出 3:
$ awk -v RS= '
{
input = "record #" NR ", [" [=14=] "]"
if ( match([=14=],/@(samp|code)\{[^A-Z]+\}/) ) {
output = "<" substr([=14=],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 ", [" [=15=] "]"
if ( match([=15=],/@(samp|code)\{[^}]+\}/) ) {
output = "<" substr([=15=],RSTART,RLENGTH) ">"
}
else {
output = "no match"
}
print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}
@samp&dsad}
]
<@code{dsadsaad}>
希望您能看到正则表达式没有任何问题,它们的行为完全符合预期,您得到了意想不到的结果,因为您希望一次处理一行输入但是您使用的在线工具 运行 显然是一次处理所有行,这就是正则表达式匹配多行字符串的不同部分的原因。
我是正则表达式的新手。谁能帮我解决一下?
我没有从事任何项目,只是想学习正则表达式。我是从这个网站看的:
ftp://ftp.gnu.org/old-gnu/Manuals/gawk-3.0.3/html_chapter/gawk_5.es.html
我已经尝试过在线正则表达式引擎。 Regex101 正则表达式测试器等
案例 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]
如何改变与自己无关的情况?
谁能解释一下?
我从您发布的图片中可以看出,您的第一个正则表达式匹配整个多行文本,而不是一次一行匹配每一行。
我说 "best I can tell" 因为当你用 awk 标记你的问题时这与 awk 无关 - 你问的是一些在线工具如何根据你的正则表达式解析你的输入,而不是 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 ", [" [=12=] "]"
if ( match([=12=],/@(samp|code)\{[^A-Z]+\}/) ) {
output = "<" substr([=12=],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 ", [" [=13=] "]"
if ( match([=13=],/@(samp|code)\{[^}]+\}/) ) {
output = "<" substr([=13=],RSTART,RLENGTH) ">"
}
else {
output = "no match"
}
print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}]
<@code{dsadsaad}>
record #2, [@samp&dsad}]
no match
到目前为止一切都很好,但现在让 awk 通过将 RS 设置为 null 来一次读取整个文件,看看我们得到了什么:
实际输出 3:
$ awk -v RS= '
{
input = "record #" NR ", [" [=14=] "]"
if ( match([=14=],/@(samp|code)\{[^A-Z]+\}/) ) {
output = "<" substr([=14=],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 ", [" [=15=] "]"
if ( match([=15=],/@(samp|code)\{[^}]+\}/) ) {
output = "<" substr([=15=],RSTART,RLENGTH) ">"
}
else {
output = "no match"
}
print input ORS output ORS
}
' file
record #1, [@code{dsadsaad}
@samp&dsad}
]
<@code{dsadsaad}>
希望您能看到正则表达式没有任何问题,它们的行为完全符合预期,您得到了意想不到的结果,因为您希望一次处理一行输入但是您使用的在线工具 运行 显然是一次处理所有行,这就是正则表达式匹配多行字符串的不同部分的原因。