Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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 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})
      匹配
      A
      ,后跟3位数字
第二个选项与第一个选项相同,但这适用于回溯:

^(?:.*(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})
      匹配
      A
      ,后跟3位数字
第二个选项与第一个选项相同,但这适用于回溯:

^(?:.*(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
^
可能是不必要的,但它确实提高了性能。