给定一个格式为someName_v0001的字符串,如何编写一个正则表达式,给出名称(_v之前的位)和版本(_v后面的位),其中版本后缀是可选的。
例如输入
input => (name, version)
abc_v0001 => (abc, 0001)
abc_v10000 => (abc, 10000)
abc_vwx_v0001 => (abc_vwx,1)
abc => (abc, null)我试过这个..。
(.*)_v\(d*) ..。但我不知道如何处理可选版本后缀的情况。
发布于 2020-09-19 22:05:07
您可以使用
^(.*?)(?:_v0*(\d+))?$见regex演示。
详细信息
^ -字符串的开始(.*?) -捕获组1:除行中断字符以外的任何零或多个字符尽可能少。(?:_v0*(\d+))? -一个可选的序列_v -一个_v子字符串0* -零或多个0字符(\d+) -捕获组2:任意一个或多个数字$ -字符串的末端。发布于 2020-09-19 22:07:25
你可以试试:
(.*)_v([\d]*)第一个捕获组是名称,第二个是版本。
() => capture result
.* => any character
_v => the string "_v" this should compensate for the special cases
[\d]* => any number of any digits 发布于 2020-09-19 22:09:34
若要说某个字符(或一组字符)是可选的,请在其后面使用?。
例如,ABC?将匹配“AB”和“ABC”,而AB(CD)?将匹配“AB”和“ABC”。
我假设您也希望使版本的“_v”部分具有可选性。在这种情况下,您需要将它封装在一个非捕获组(?: )中,这样您就可以使用?使它成为可选的,而不需要捕获它。
对于您的场景,正确的正则表达式是(.*)(?:_v(\d+))?。捕获组1将是名称,捕获组2将是版本,如果存在的话。
https://stackoverflow.com/questions/63973747
复制相似问题