[英]Optional parts in javascript regular expression (with capture groups)
[英]Regular expression capture with optional trailing underscore and number
我试图找到一个与基本字符串匹配的正则表达式,而没有可选的尾随数字( _123
)。 例如:
lorem_ipsum_test1_123
>捕获lorem_ipsum_test1
lorem_ipsum_test2
>捕获lorem_ipsum_test2
我尝试使用以下表达式,但仅在尾随_number时有效。 /(.+)(?>_[0-9]+)/ /(.+)(?>_[0-9]+)?/
类似地,添加?
(零个或多个)量词仅在没有尾随_number时起作用,否则,尾随_number将只是第一次捕获的一部分。
有什么建议么?
您可以使用以下表达式:
^(?:[^_]+_)+(?!\d+$)[^_]+
^
锚定字符串的开头。 (?:[^_]+_)+
重复的非捕获组。 除_
之外的其他任何字符的取反字符集,后跟_
。 (?!\\d+$)
字符串末尾的数字负向搜索。 [^_]+
除_
以外的任何其他字符。 正则表达式演示在这里 。
请注意,Regex演示中字符集中的\\n
仅用于演示目的,在用作Javascript模式时,应将其全部删除。
JavaScript演示:
var myString = "lorem_ipsum_test1_123"; var myRegexp = /^(?:[^_]+_)+(?!\\d+$)[^_]+/g; var match = myRegexp.exec(myString); console.log(match[0]); var myString = "lorem_ipsum_test2" var myRegexp = /^(?:[^_]+_)+(?!\\d+$)[^_]+/g; var match = myRegexp.exec(myString); console.log(match[0]);
您可以匹配任何字符,并使用否定的前瞻来断言其后不是下划线,一个或多个数字以及字符串的结尾:
^(?:(?!_\\d+$).)*
说明
^
字符串的开始 (?:
非捕获组
(?!
负断言断言右边的内容不是
_\\d+$
匹配一个下划线,一个或多个数字并断言字符串的结尾 .)
匹配任何字符并关闭否定提前 )*
关闭非捕获组并重复零次或多次 const strings = [ "lorem_ipsum_test1_123", "lorem_ipsum_test2" ]; let pattern = /^(?:(?!_\\d+$).)*/; strings.forEach((s) => { console.log(s + " ==> " + s.match(pattern)[0]); });
你要
/^(.*?)(?:_\d+)?$/
参见regex演示 。 这里的要点是,第一个点图案必须是非贪婪的,并且_\\d+
应该用一个可选的非捕获组包裹,并且整个图案(尤其是结尾)必须用锚点括起来。
细节
^
-字符串的开头 (.*?)
-捕获组1:除换行符以外的零个或多个字符,由于非贪婪( “ lazy” )量*?
而应尽可能少 (?:_\\d+)?
-可选的非捕获组,匹配1或0个出现的_
,然后匹配1+个数字 $
-字符串结尾。 但是,使用单纯的替换方法似乎更容易,
s = s.replace(/_\d+$/, '')
如果字符串以_
和1+数字结尾,则子字符串将被删除,否则,字符串将保持不变。
请参阅此正则表达式演示 。
尝试检查字符串是否包含尾随数字。 如果是这样,您只能得到另一部分。 否则,您将得到整个字符串。
var str = "lorem_ipsum_test1_123"
if(/_[0-9]+$/.test(str)) {
console.log(str.match(/(.+)(?=_[0-9]+)/g))
} else {
console.log(str)
}
或者,更简洁一些:
str = str.replace(/_[0-9]+$/g, "")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.