使用正则表达式顺序匹配正则表达式,而不是JavaScript中的字符串顺序
我想从一个字符串中提取一个特定的模式,如果它不在那里,则提取另一个模式 所讨论的字符串可能以任何顺序同时具有这两种模式。不管顺序如何,我希望第一种模式优先 我知道我可以用多行/使用正则表达式顺序匹配正则表达式,而不是JavaScript中的字符串顺序,javascript,regex,Javascript,Regex,我想从一个字符串中提取一个特定的模式,如果它不在那里,则提取另一个模式 所讨论的字符串可能以任何顺序同时具有这两种模式。不管顺序如何,我希望第一种模式优先 我知道我可以用多行/匹配调用来实现这一点,但我想知道是否可以用一个匹配调用来实现这一点 var s1 = "hello A123 B456" var s2 = "hello B123 A456" 我想先捕获A###模式,只有当它不在那里时,才捕获B##模式 console.log(s1.match(/((A|B)\d{3})/)[1]);
匹配
调用来实现这一点,但我想知道是否可以用一个匹配
调用来实现这一点
var s1 = "hello A123 B456"
var s2 = "hello B123 A456"
我想先捕获A###
模式,只有当它不在那里时,才捕获B##
模式
console.log(s1.match(/((A|B)\d{3})/)[1]); // A123
console.log(s2.match(/((A|B)\d{3})/)[1]); // B123 -- but I want it to capture the A123 first
我想您可以通过将首选选项锚定到主题的开头来实现这一点:
re=/^.*(A\d+)|(B\d+)/
测试=[
“你好,A456 B123”,
“你好,B123 A456”,
“你好,A456 zzz”,
“你好,B123 zzz”,
];
对于(t试验){
m=t.匹配(re)
console.log(t,'=',m[1]| | m[2])
}
我想您可以通过将首选选项锚定到主题的开头来实现这一点:
re=/^.*(A\d+)|(B\d+)/
测试=[
“你好,A456 B123”,
“你好,B123 A456”,
“你好,A456 zzz”,
“你好,B123 zzz”,
];
对于(t试验){
m=t.匹配(re)
console.log(t,'=',m[1]| | m[2])
}
您可以使用以下任意一种正则表达式模式来完成此操作:
^(?:.*(A\d{3})|.*(B\d{3})) # pattern 1
^(?:.*(?=A)|.*(?=B))([AB]\d{3}) # pattern 2
模式1 正则表达式 优点/缺点:简单,但使用两个捕获组
^(?:.*(A\d{3})|.*(B\d{3}))
工作原理:
将其锚定到字符串的开头^
匹配以下任一选项(?:.*(A\d{3})|.*(B\d{3}))
匹配任意字符(换行符除外)任意次数(它是贪婪的,所以会尽可能多地匹配)*
匹配(A\d{3})
,后跟3位数字A
^(?:.*(A\d{3})|.*(B\d{3}))
hello B123 A456
^ # anchor to the start of the string (to the location before the h)
# now attempt option 1 of the alternation: .*(A\d{3})
.* # match any character any number of times (greedy)
hello B123 A456 # this is what we currently match
# now backtrack to find A\d{3}
hello B123 A # we found A, check to see if \d{3} matches
hello B123 A456 # pattern fulfilled; result you're looking for in group 1
密码
s=[“你好A123 B456”,“你好B123 A456”,“你好B123”]
r=/^(?:*(A\d{3})|*(B\d{3}))/
适用于(x/s){
m=x.match(r)
如果(m)
console.log(m[1]| | m[2])
}
您可以使用以下任意一种正则表达式模式来完成此操作:
^(?:.*(A\d{3})|.*(B\d{3})) # pattern 1
^(?:.*(?=A)|.*(?=B))([AB]\d{3}) # pattern 2
模式1 正则表达式 优点/缺点:简单,但使用两个捕获组
^(?:.*(A\d{3})|.*(B\d{3}))
工作原理:
将其锚定到字符串的开头^
匹配以下任一选项(?:.*(A\d{3})|.*(B\d{3}))
匹配任意字符(换行符除外)任意次数(它是贪婪的,所以会尽可能多地匹配)*
匹配(A\d{3})
,后跟3位数字A
^(?:.*(A\d{3})|.*(B\d{3}))
hello B123 A456
^ # anchor to the start of the string (to the location before the h)
# now attempt option 1 of the alternation: .*(A\d{3})
.* # match any character any number of times (greedy)
hello B123 A456 # this is what we currently match
# now backtrack to find A\d{3}
hello B123 A # we found A, check to see if \d{3} matches
hello B123 A456 # pattern fulfilled; result you're looking for in group 1
密码
s=[“你好A123 B456”,“你好B123 A456”,“你好B123”]
r=/^(?:*(A\d{3})|*(B\d{3}))/
适用于(x/s){
m=x.match(r)
如果(m)
console.log(m[1]| | m[2])
}
您也可以通过消极的前瞻来实现结果
var s1=“你好A123 B456”;
var s2=“你好B123 A456”;
const regex=/A\d{3}B\d{3}(?。*A\d{3})/
console.log(s1.match(regex)[0]);
console.log(s2.match(regex)[0])代码>您还可以通过负前瞻来实现结果
var s1=“你好A123 B456”;
var s2=“你好B123 A456”;
const regex=/A\d{3}B\d{3}(?。*A\d{3})/
console.log(s1.match(regex)[0]);
console.log(s2.match(regex)[0])代码>正则表达式从左到右开始匹配,那么如何首先开始匹配A123?顺便说一下,你可以使用lookback或lookahead,这就是我在这里提问/发帖的原因。我想知道它们是否是告诉它优先于匹配模式的一种方法?那么^(?:.*(a\d{3})|.*(B\d{3}))
我不知道如何在单个匹配中实现它。regex从左到右开始匹配,然后如何首先开始匹配123?顺便说一下,你可以使用lookback或lookahead,这就是我在这里提问/发帖的原因。我想知道它们是否是告诉它优先于匹配模式的一种方式?那^(?:.*(a\d{3})|.*(B\d{3}))呢我不知道如何在单个匹配中做到这一点。^
似乎不必要。^.*(a\d+)(B\d+
更快@3limin4t0r^
可能是不必要的,但它确实提高了性能。^
似乎是不必要的。^.*(A\d+)(B\d+)
更快@3limin4t0r^
可能是不必要的,但它确实提高了性能。