Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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正则表达式中的条件_Javascript_Regex - Fatal编程技术网

我想模仿javascript正则表达式中的条件

我想模仿javascript正则表达式中的条件,javascript,regex,Javascript,Regex,这就是我目前所拥有的 var regex_string = "s(at)?u(?(1)r|n)day" console.log("Before: "+regex_string) var regex_string = regex_string.replace(/\(\?\((\d)\)(.+?\|)(.+?)\)/g,'((?!\\$1)$2\\$1$3)') console.log("After: "+regex_string) var rex = new RegExp(regex_string

这就是我目前所拥有的

var regex_string = "s(at)?u(?(1)r|n)day"
console.log("Before: "+regex_string)
var regex_string = regex_string.replace(/\(\?\((\d)\)(.+?\|)(.+?)\)/g,'((?!\\$1)$2\\$1$3)')
console.log("After: "+regex_string)
var rex = new RegExp(regex_string)

var arr = "thursday tuesday thuesday tursday saturday sunday surday satunday monday".split(" ")
for(i in arr){
  var m
  if(m = arr[i].match(rex)){
    console.log(m[0])
  }
}
我将
(?(n)a | b)
替换为
(?!\n)a |\nb)
,其中
n
是一个数字,
a
b
是字符串。这似乎工作得很好-然而,我知道这是一个巨大的漏洞


有更好的方法来解决这个问题吗?

在您的正则表达式的特定情况下,使用交替选项更简单、更易读:

(?:sunday|saturday)
或者,您可以仅在涉及条件正则表达式的两个位置之间创建交替(这在有许多这样的条件表达式的情况下更有用,但只引用附近的捕获组)。以您的案例为例,我们将仅为
un
atur
创建备选方案,因为只有这些方案涉及到以下情况:

s(?:un|atur)day

有两种常见的条件正则表达式类型。(Perl正则表达式支持更多奇特的东西,但这些需要支持JavaScript正则表达式或其他常见正则表达式引擎不具备的特性)

  • 第一种类型是提供显式模式作为条件。这种类型可以在JavaScript正则表达式中模仿。在支持条件正则表达式的语言中,模式将是:

    (?(conditional-pattern)yes-pattern|no-pattern)
    
    在JavaScript中,您可以通过前瞻来模拟它,并且(显然)假设原始的
    条件模式是前瞻的:

    ((?=conditional-pattern)yes-pattern|(?!conditional-pattern)no-pattern)
    
    负前瞻是必要的,以防止输入字符串通过
    条件模式
    并在
    是模式
    中失败,但它可以匹配
    否模式
    。这样做是安全的,因为积极环顾和消极环顾在逻辑上是完全相反的

  • 第二种类型是提供对捕获组的引用(名称或编号),当捕获组具有匹配项时,条件将被评估为true。在这种情况下,没有简单的解决方案

    我能想到的唯一办法就是复制,就像我以你的案件为例所做的那样。这当然会降低可维护性。可以通过将正则表达式编写成部分(在literal RegExp中),使用
    source
    属性检索字符串,然后将它们连接在一起,来编写正则表达式;这将允许更改传播到其他重复的部分,但使其更难理解正则表达式和/或对其进行重大修改

  • 参考资料

    • :Ctrl+F表示
      (?(
    • :Ctrl+F表示
      (?(

    好吧……如果你告诉我们你的目标会容易得多。好吧……
    s(at)?u(?(1)r | n)day
    在javascript中是无效的正则表达式,它不支持像
    (?(1)r | n)
    这样的条件。我的中介正则表达式将这个条件转换为一个模仿它的模式,并在javascript中工作……
    ((?!\1)r |\1n)
    但是,尽管它似乎可行,但我认为这不是正确的方法。我的目标是能够以通常的方式编写条件语句,并自动将正则表达式修改为可以在JavaScription中使用的形式。为什么要这样做?在代码中选择正则表达式要容易得多。(你是否遇到了一个X-Y问题?你正试图解决某个问题(X),并且已经想出了正则表达式(Y),但他们并没有完全按照你的意愿去做。与其强迫正则表达式去解决Y,不如考虑其他方法来解决你真正的问题(X))。