繁体   English   中英

正则表达式捕获,带有可选的下划线和数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM