Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Javascript 是否有这样一种情况,即;[^xy]";不等于;(?!x|y)。”;?_Javascript_Regex - Fatal编程技术网

Javascript 是否有这样一种情况,即;[^xy]";不等于;(?!x|y)。”;?

Javascript 是否有这样一种情况,即;[^xy]";不等于;(?!x|y)。”;?,javascript,regex,Javascript,Regex,我正在开发自己的JavaScript库,以支持正则表达式的新元字符和功能,我想找到一种情况,[^xy]不等同于(?!x)。(或者更具体地说,(?:(?!x | y)。) 以文本为例:“abc\n” 假设我想模拟Perl正则表达式:/\a.{3}\Z/s 使用单线标志时,JavaScript正则表达式应等效为:/^[\s\s]{3}\n*$(?!\s)/(\A变成^,变成[\s],\Z变成\n*$(?!\s)) 现在,/^.{3}$/将失败,但是/^[\s\s]{3}\n*$(?!\s)/将捕获“

我正在开发自己的JavaScript库,以支持正则表达式的新元字符和功能,我想找到一种情况,
[^xy]
不等同于
(?!x)。
(或者更具体地说,
(?:(?!x | y)。

以文本为例:
“abc\n”

假设我想模拟Perl正则表达式:
/\a.{3}\Z/s

使用单线标志时,JavaScript正则表达式应等效为:
/^[\s\s]{3}\n*$(?!\s)/
\A
变成
^
变成
[\s]
\Z
变成
\n*$(?!\s)

现在,
/^.{3}$/
将失败,但是
/^[\s\s]{3}\n*$(?!\s)/
将捕获“abcabc”(与Perl正则表达式相同)

由于
\Z
包含的不仅仅是元字符,因此模拟
[^\Z]
似乎更加困难

以文本为例:
“abcabc\n”

Perl正则表达式
/.{3}[^\Za]/g
的建议JavaScript正则表达式将是
{3}(?:(?!\n*$(?!\s)| a)。/g

两者都将匹配
“bcab”


所以,最后,我再次提出这个问题。是否存在这样一种情况,在这种情况下,
[^xy]
不等同于
(?:(?!x | y)。
,可能是在一个更复杂的正则表达式中,前瞻会改变这种情况?

[^xy]
将匹配
\n
<代码>(?!x | y)。默认情况下将不匹配
\n
(因为
不匹配
\n

我不相信javascript有“dotall”或“single line”修饰符,但随着每个浏览器的新版本每隔几个月出现一次,我已经迷失了方向。

对于输入字符串
“x\na”
,这两个regexp给出了不同的输出,因为
与新行不匹配

console.log("x\na".match(/(?:(?!x|y).)/))
["a", index: 2, input: "x↵a"]
console.log("x\na".match(/[^xy]/))
["↵", index: 1, input: "x↵a"]
如果将
更改为
[\s\s]
,则在这种情况下,输出相同:

console.log("x\na".match(/(?:(?!x|y)[\s\S])/))
["↵", index: 1, input: "x↵a"]
我现在想不出还有别的案子

是否存在
[^xy]
不等于
(?!x | y)的情况。

只有您已经描述过的一个:JS点与换行符不匹配,需要替换为
[\s\s]

\Z
变成
\n$(?!\s)

这看起来不对。字符串(
\z
/
$
)结束后,将不会有任何内容,无论是否为空白。好吧,
\Z
是一个零宽度断言(它不使用换行符),应该与

(?=\n*$)
//   ^ not sure whether ? or *
由于
\Z
包含的不仅仅是元字符,因此模拟
[^\Z]
似乎更加困难


你说的“元字符”是什么意思?这是一个零宽度断言,在字符类中没有多大意义。我猜这要么是语法错误,要么会被逐字解释为
[^Z]

,正如其他人所说,在替换中应该使用
[\s\s]
而不是
。否则,如果您只是通过文本字符串进行转换,那么还有一些事情需要处理。特别是元字符和转义序列:

[^*)] => (?!\*|\))[\s\S]
但我想你还是需要特别注意分析和编写元字符

最棘手的可能是
\b
,因为它是字符类中的一个字符(退格),外部是一个单词边界。因此,在替换中,必须使用八进制或十六进制转义:

[^a\b] => (?!a|\10)[\s\S] 
    or => (?!a|\x08)[\s\S]

除此之外,两者应始终相等。

格式
[^xy]
(?:(?!x | y)不同的情况下,
中x是零宽度断言,而不是实际字符,如:

给定此示例文本:
ab yz

正则表达式:
[^\by]
示例:

返回:

[0] => a
[1] => b
[2] => -
[3] => z
[0] => b
[1] => z
鉴于

正则表达式:
(?:(?!\b|y)。
示例:

返回:

[0] => a
[1] => b
[2] => -
[3] => z
[0] => b
[1] => z
其他非等效表达式主要关注的是相同语法在字符类内部或外部有不同的用法:

  • [^^y]
    产生a,b,-,z不等于
    (?:(?!^ | y)。
    产生b,-,z
  • [^.y]
    产生a,b,-,z不等于
    (?:(?!.| y)。
    不产生任何结果
或者,您可以在Perl中的unicode nugget中尝试以下内容:

收益率:

capture

class
1

/^[\s\s]{3}\n*$(?!\s)/.exec(“abcabc\n”)
与我不匹配,也没有像你所说的那样给出
abcabc
,perl正则表达式
/\A.{3}\Z/s
“abcabc\n”
匹配……正确。我改变了一些东西,忘了编辑它们。第一个场景使用文本“abc\n”,第二个场景使用文本“abcabc\n”。我已经对主要帖子进行了编辑。
[^\Z]
不是一件事,因为
\Z
不是一个字符。键入:\Z变成\n*$(?!\s)。在Perl中,\Z相当于\n*\Z\z仅在字符串末尾为真。因此,如果\z是$(?!\s),则\z是\n*$(?!\s)。似乎我已经开始对整个“转化”的想法进行了仔细的思考。关于[^\Z]变成[^Z]的说法完全正确。我想我需要从编程中休息一下,谢谢你的洞察力。:)@问题是,
\n
不包括在匹配中。所以
\n
也属于前瞻性(我不太确定
\n
之后的星星)我在上面的评论中做了编辑,但看起来你打败了我。感谢您研究我推理的实际问题。哦,我想我现在明白了您在
$
之后所说的
(?=\s)
是什么意思了-这是为了确保在多行模式下正确匹配。事实上,我对此不太了解(在JS中从未使用过),所以我可能错了,字符类中的单词边界对你来说意味着什么?它对我来说没有任何意义,但是Joey的问题是
,我想找到一个