Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 这个正则表达式中发生了什么_Regex_Perl_Pipe_Strip - Fatal编程技术网

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