我想模仿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正则表达式或其他常见正则表达式引擎不具备的特性)
(?(conditional-pattern)yes-pattern|no-pattern)
在JavaScript中,您可以通过前瞻来模拟它,并且(显然)假设原始的条件模式是前瞻的:
((?=conditional-pattern)yes-pattern|(?!conditional-pattern)no-pattern)
负前瞻是必要的,以防止输入字符串通过条件模式
并在是模式
中失败,但它可以匹配否模式
。这样做是安全的,因为积极环顾和消极环顾在逻辑上是完全相反的
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))。