不确定这是否贪婪,但想知道如何做到这一点。我想:
+
,?
或*
)+
,?
或*
,请保留该信息以下是一些示例输入和所需输出:
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]
基本上我只想从可能的类似正则表达式的字符串中解析出运算符(*+?
)。有什么想法吗?
答案 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 强>
这将匹配:
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
使用此功能,您将涵盖两种情况,包括+
,*
或?
完成的情况以及其他情况