Regex 这个正则表达式中发生了什么
下面的常规表达式可以工作,但有人能解释一下如何工作吗? 任何评论都将不胜感激!谢谢藜麦 正则表达式“|”是如何从Regex 这个正则表达式中发生了什么,regex,perl,pipe,strip,Regex,Perl,Pipe,Strip,下面的常规表达式可以工作,但有人能解释一下如何工作吗? 任何评论都将不胜感激!谢谢藜麦 正则表达式“|”是如何从保留此中剥离标记“”和“”,以将保留此到内存$1中的 以下是正则表达式: (?x) ([\w\.!?,\s-])|<.*?>|. (?x) ([\w\.!?,\s-])||。 以下是字符串: <script>Keep THIS</Script> 保留这个 结果:$1=“保留此项” 评论如下: (?x)
保留此中剥离标记“”和“”,以将保留此到内存$1中的
以下是正则表达式:
(?x)
([\w\.!?,\s-])|<.*?>|.
(?x)
([\w\.!?,\s-])||。
以下是字符串:
<script>Keep THIS</Script>
保留这个
结果:$1=“保留此项”
评论如下:
(?x) set flags for this block (disregarding
whitespace and comments) (case-sensitive)
(with ^ and $ matching normally) (with .
not matching \n)
( group and capture to \1:
[\w\.!?,\s-] any character of: word characters (a-z,
A-Z, 0-9, _), '\.', '!', '?', ',',
whitespace (\n, \r, \t, \f, and " "), '-
'
) end of \1
| OR
< '<'
.? any character except \n (optional
(matching the most amount possible))
> '>'
| OR
. any character except \n
(?x)为此块设置标志(忽略
空格和注释)(区分大小写)
(通常与^和$匹配)(与。
不匹配\n)
(组和捕获到\1:
[\w\.!?,\s-]的任何字符:单词字符(a-z,
A-Z,0-9,
空白(\n、\r、\t、\f和“”),'-
'
)结束\1
|或
< ''
|或
. 除以下字符之外的任何字符\n
匹配所有标记,也就是说它匹配所有以
结尾的字符串。然后从剩下的字符串中,这个([\w\.!?,\s-])
正则表达式将捕获所有单词字符或点或
或?
或空格、逗号或连字符。请注意,它会将每个字符捕获到组1中
如果要捕获整个字符串将其保留在组1中,则需要在字符类旁边添加+
量词<代码>+
将上一个令牌重复一次或多次
([\w\.!?,\s-]+)|<.*?>|.
([\w\.!?,\s-]+)|。
最后,
匹配所有未匹配的剩余字符
这样做的唯一方法是在循环中使用全局匹配,并且没有设置使用警告
以下是我认为您拥有的,但是使用Data::Dump
来显示$1
的内容,而不是您自己的代码中的print$1
。(显示实际的Perl代码而不是选定的代码片段确实很有帮助。)
- 第一个过程是匹配的
,它没有被捕获,因此$1
是未定义的
- 后续过程匹配类
[\w\.!,\s-]
中的单个字符,该类使用字符串一次保留一个字符
- 最后,结束符
在不捕获的情况下进行匹配,并再次保留$1
未定义
undef
打印为空字符串,如果未启用warnings
,则不会向您发出警报
解决方案是始终使用poper HTML解析器来处理HTML。正则表达式是用于此作业的错误工具。下面是示例中使用的带有标记的字符串:““Keep THIS”请始终显示您的Perl代码。有很多方法可以组合您展示的组件。感谢Avinash的及时回复!你是说有一个匹配的顺序吗?顺序是否从右边开始,最后一个“|”之前的句点?1.第一个匹配是由“|.”,它是整个字符串,2。第二个匹配项是标签和3。第三个匹配项是剩余的字符串。首先([\w\.!,\s-]+)
匹配除
之外的所有单词字符、空格等。然后,在它看到模式
之后,它匹配标记字符串,只在之间保留剩余的字符串。但是我总是建议你写|([\w\.!?,\s-])|。
。最后,这是一个好消息。匹配所有未匹配的剩余字符。请注意,正则表达式引擎从左到右解析字符串。Avinash,我删除了最后一个“|”字符。如果没有它,它将无法工作。谢谢是的,最后的|。
用于匹配所有剩余字符。所以这是必须的。
use strict;
use warnings;
use Data::Dump;
my $s = '<script>Keep THIS</Script>';
my $re = qr/(?x)
([\w\.!?,\s-])|<.*?>|./;
while ( $s =~ /$re/g ) {
dd $1;
}
undef
"K"
"e"
"e"
"p"
" "
"T"
"H"
"I"
"S"
undef