2017-07-26 332 views
1

结束使用正则表达式的字符串的后缀我想找出这样的前缀和字符串的后缀:正则表达式匹配的前缀和数字

T12231 should match ['T', '12231'] 

Acw2123 should match ['Acw', '2123'] 

121Ab should match ['121ab', null] 

1213 should match [null, '1213'] 

在字符串的结尾匹配只能号码轻松完成这个正则表达式/([0-9]+)$/g

匹配所有从字符串开头到这一点,我没有设法做。我得到的最接近的是第一组匹配的所有内容,但最后一个数字是/^(.*)([0-9]+)$/g

+2

第一组可能是 “什么,这不是一个数字”,或者从你的例子,“任何大写/小写字母字符“。 '\ d'与'[0-9]'相同,'\ D'与'[^ 0-9]'相同,所以你可以寻找类似'/ ^(\ D *?) d +)$ /'...如果你同时使用'^'和'$','/ g'就没有意义,因为它会匹配整行。 –

+0

“123Ab345”匹配什么? – sln

+0

@sln ['1234Ab','345'] – toskv

回答

3

您可以第一个捕捉组懒惰,.*?所以它匹配尽可能短,即,使第二捕获组尽可能长:

var s = ["T12231", "Acw2123", "121Ab", "1213"]; 
 

 
console.log(
 
    s.map(x => x.replace(/^(.*?)([0-9]*)$/, "$1 $2")) 
 
);

推分裂导致到一个数组:

var s = ["T12231", "Acw2123", "121Ab", "1213"]; 
 

 
var arr = []; 
 
s.forEach(x => x.replace(/^(.*?)([0-9]*)$/, (string, $1, $2) => arr.push([$1, $2]))); 
 

 
console.log(arr);

+0

这就是我一直想念的。懒惰的评估是有用的。谢谢! – toskv

+0

不客气。很高兴帮助! – Psidom

1

你几乎是对的。尝试使用这样的:

var re = /^(.*?)(\d+.*)$/g; 
var groups = re.exec(your_string) 
+0

这确实匹配正确。第二组最后允许任何角色。 '123Ab456'获得匹配结果为['','123Ab456'] – toskv

+0

是不是应该发生? –

+0

不,我期望在这种情况下得到['123Ab','456']。我试图解决的问题是生成一个'123Ab456'将是'123Ab457'的下一个字符串。所以我需要在字符串中的最后一个数字,其余的我可以将它们缝合在一起。 – toskv

1

满足所有情况下

^(?=\d|.*\d$)((?:(?!\d+$).)*)(\d*)$

https://regex101.com/r/BWwsIA/1

^       # BOS 
(?= \d | .* \d $)   # Must begin or end with digit 
(       # (1 start) 
     (?:       # Cluster begin 
      (?! \d+ $)     # Not digits then end 
      .        # Any char 
    )*       # Cluster end, 0 to many times 
)        # (1 end) 
(\d*)      # (2) 
$        # EOS