如何在JavaScript中进行贪婪的匹配?

时间:2014-09-09 20:07:32

标签: javascript regex

不确定这是否贪婪,但想知道如何做到这一点。我想:

  • 匹配任何字符串(包括任何+?*
  • 如果最后有+?*,请保留该信息

以下是一些示例输入和所需输出:

match("foo+"); // ["foo", "+"]
match("1+2"); // ["1+2"]
match("a+b+"); // ["a+b", "+"]
match("a*b?"); // ["a*b", "?"]
match("some+really+long+string+"); // ["some+really+long+string", "+"]

这是我尝试的模式,但它只匹配整个字符串:

var s = "\\d+";
var p = /(.+)([\+\*\?])?$/;
p.match(s); // ["\d+", "\d+", undefined]

基本上我只想从可能的类似正则表达式的字符串中解析出运算符(*+?)。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您的初始匹配需要非贪婪,您需要锚定正则表达式

var s = "\\d+";
var p = /^(.*?)(\+|\?|\*)?$/;

s.match(p); // ["\d+", "\d", "+"];

请注意,如果您的评论(“我基本上只想删除最后一个字符,如果它是* +?”)实际上是准确的,那么正则表达式对于这项工作来说是一个糟糕的工具。

使用s[s.length - 1]获取最后一个字符。

答案 1 :(得分:0)

如果我理解你的要求,那么你可能想要

var arr = str.match(/([\w\+\?\*]+\w)([\w\+\?\*]?)/)

数组中的第一个元素是整个匹配。如果您只想要子匹配,请选择arr.slice(1)

答案 2 :(得分:0)

你可以使用这样的正则表达式:

^(.+)([+*?])$|(.+)

<强> Working demo

enter image description here

这将匹配:

MATCH 1
1.  `foo`
2.  `+`
MATCH 2
1.  `1+2`
MATCH 3
1.  `a+b`
2.  `+`
MATCH 4
1.  `a*b`
2.  `?`

因此,我们的想法是拥有一个捕获的模式:

^(.+)([+*?])$  ---> the content and also everything that finish with a +, * or ?
|(.+)          ---> or... all the content

使用此功能,您将涵盖两种情况,包括+*?完成的情况以及其他情况