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
如何引用转义(文字)元字符(Perl/PHP)的正则表达式Delimeter?_Php_Regex_String_Perl_Escaping - Fatal编程技术网

如何引用转义(文字)元字符(Perl/PHP)的正则表达式Delimeter?

如何引用转义(文字)元字符(Perl/PHP)的正则表达式Delimeter?,php,regex,string,perl,escaping,Php,Regex,String,Perl,Escaping,我对此不确定,认为这是不可能的,但我想我还是会问的 我想使用一个正则表达式delimeter,它是元字符。例如 括号、括号等[],(),… 但任何事情都是真的 这并不是我需要做的,而是我试图在项目中编写一个转义例程 那么,有什么问题?当regex主体不是真正的元字符时,问题就出现了 它是一个文字,如: /\(\)/其中正斜杠delimeters将替换为(和) 例如,在Perl中,这些将不起作用 =~m(\(\) =~m(\\(\\) =~m(\\\(\\\) =~m(\\\\(\\\\) 再多的

我对此不确定,认为这是不可能的,但我想我还是会问的

我想使用一个正则表达式delimeter,它是元字符。例如
括号、括号等[],(),…
但任何事情都是真的

这并不是我需要做的,而是我试图在项目中编写一个转义例程

那么,有什么问题?当regex主体不是真正的元字符时,问题就出现了
它是一个文字,如:

/\(\)/
其中正斜杠delimeters将替换为

例如,在Perl中,这些将不起作用
=~m(\(\)

=~m(\\(\\)

=~m(\\\(\\\)

=~m(\\\\(\\\\)

再多的括号转义都不会出现一个反斜杠,即文字
\(

delimeter上的反斜杠总是被删除,其余的反斜杠则遵循正常的报价规则。这总是导致偶数个反斜杠

PHP显然也是这样

正如我所说,在正常操作中,我不会使用元字符作为限定符,这
这只是我想写的一个实用程序(现在似乎在jepardy中)

我试图只使用基本的转义规则,并且希望避免扫描字符串
提前在
正则表达式文本体

Perl使用
q()
qq()
来正确执行此操作(不幸的是不是qr()。
它通过同时移除逃生阀上的逃生阀和Delimeter上的逃生阀来实现此目的。
因此,
q(\\\(\\\)
导致
\(\)

谢谢你的帮助

编辑
经过一些研究后,我发现这是不可能的,所以公用事业被废弃了。
不过,感谢您的宝贵意见。Perl的
报价选项,尤其是“类似报价的操作员”,其工作

但是delimeter实际上是用于quote操作符的,而不是正则表达式。

我不了解PHP,但是您可以在Perl中使用
\Q

"()" =~ m(\Q\(\)\E) and print "YES\n"
使用单成员字符类应该在Perl和PHP中都适用:

"()" =~ m([(][)]) and print "YES\n"

你能把你的例子发展得更精确一点吗?

因为
如果原始字符串->
'\('


然后,
/[\\][(]/
将匹配它

[我不确定你是问Perl还是PHP,我只知道Perl]

正则表达式文本被解析两次,一次由Perl编译器解析,一次由正则表达式编译器解析

  • Perl解析器在处理插值、转义分隔符和序列(如
    \Q
    \L
    )时查找文本的结尾。这将生成正则表达式模式(作为字符串)和匹配选项(例如不区分大小写的匹配)

    qr/\/\(/
    生成模式
    /\(
    /
    未被替换)。类似地,
    qr(\/\()
    生成模式
    \/(
    未被替换)

  • 正则表达式编译器接受正则表达式模式和匹配选项,并返回已编译的正则表达式

    /\(
    生成与
    /(
    )完全匹配的正则表达式,而
    \/(
    产生正则表达式语法错误

  • 要生成完全匹配
    )的正则表达式,您需要生成模式
    \(
    或等效模式。以下是您的选项:

    • qr/\(/
      (不要将其用作分隔符)
    • $d='(';qr(\Q$d\E)
      (不要在文本中使用)
    • qr(\Q\(\E)
      (使用
      \Q
      \(
      已成为
      )之后插入转义符)
    • qr(\x28)
      (使用等效物)
    • qr([\(])
      (以不需要转义的方式使用)

    到目前为止,您最好的选择是简单地选择一个不同的分隔符:一个不是元字符的分隔符,或者一个没有在模式中使用的分隔符。这很简单,因为它只对硬编码模式有影响。

    谢谢。通过delimeter是个问题。您指定的情况有效,因为delimeter被转义,或者在第二个示例中被内化。For实例
    m*[*][*]*
    将不进行分析。@sln:
    “”(=~m([\)][\(])并打印“YES\n”
    “**”=~m*[\*][\*]*并打印“YES\n”
    你是对的,因为delimeters是转义的,但一般来说,我不认为未分类的文字元可以用作正则表达式delimeter。我认为这是徒劳的。谢谢你的帮助!@sln:我不确定你想实现什么。也许使用变量可以帮助你?
    $r=qr/\*\*/;“**”=~m*$r*并打印“是的\n”
    再次感谢。实际上,我正试图创建一个通用实用程序,它接受一个简单的正则表达式字符串并添加和转义delimeters。但我现在明白了这是不可能的。谢谢。你说得对,但是如何使用
    作为带有原始字符串的delimeters
    \(
    ?感谢您对Perl的深入了解。似乎没有编程方式引用regex delimeters。最接近的是“类似引号的运算符”,因为它们删除了转义的转义,并且delimeter转义允许单个转义(delimeter)要呈现给正则表达式引擎的字符。当然,如果使用元字符作为delimeters,这只是一个问题。唉,这种折磨已经走到了尽头。实用程序报废了!谢谢!