当前位置: 首页 > 知识库问答 >
问题:

正则表达式可选组

何修能
2023-03-14

我使用这个正则表达式

((?:[a-z][a-z]+))_(\d+)_((?:[a-z][a-z]+)\d+)_(\d{13})

要匹配这样的字符串:

SH_6208069141055_BC000388_20110412101855

分为4组:

SH
6208069141055
BC000388
20110412101855

问:我如何使第一个组可选,使结果组是一个空字符串?
我想在每种情况下得到4组,如果可能的话。

这种情况下的输入字符串:(第一组后面没有下划线)

6208069141055_BC000388_20110412101855

共有2个答案

山越
2023-03-14

您可以很容易地将正则表达式简化为:

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$
^              ^^
|--------------||
| first group  ||- quantifier for 0 or 1 time (essentially making it optional) 

我不确定没有第一组的输入字符串是否会有下划线,但是如果是整个字符串,您可以使用上面的正则表达式。

regex101演示

如您所见,第二个匹配中匹配的组1为空,从匹配的组2开始。

芮博厚
2023-03-14

要创建一个非捕获、零到多匹配组,必须附加

(?: ..... )?
^          ^____ optional
|____ group

 类似资料:
  • 问题内容: 我在尝试忽略某些字符之间的空格时遇到问题。我已经搜寻了几天,似乎找不到合适的解决方案。 这是我的代码: 基本上,这些是我遇到的一些情况: (请注意,width =“”和src =“”之间没有空格) 和 (请注意,在width =“”和height =“”之间没有空格。) 无论如何,有没有忽略这些字符之间的空格?因为我不是Regex专家。 问题答案: 如果可以使用空格,请添加一个。 \

  • 我试图写一个正则表达式来匹配三个组,在三个组中,我希望有一个组是可选的。 正则表达式: 它匹配以下内容: 但是,不是在下面。 如何修改正则表达式,使其匹配两个组。如果第一条消息是三个组。 修复 测试 消息 如果是第二条消息,只有两组 < li >修复 < li >消息 消息

  • 我想创建一个正则表达式,其中包含必须包含在字符串中的组和仅可选的组。我为此使用c#。 我的目标字符串如下所示 我有以下要求: ##开头和结尾是强制性的(但这不一定是行的开头或结尾) ##和#(或##)之间的字符串也是强制性的 E{数字}或E-{数字}是可选的 到目前为止我已经想出了 = = 你能帮我创建一个适合我要求的正则表达式吗?

  • 我是一个完全的正则表达式新手,花了几个小时试图解决这个难题。我认为我必须使用某种可选的非捕获组或交替。 我想匹配以下字符串: > 诺伊尔电影 a von 1000 诺伊尔电影a von 1000 mit b 诺伊尔电影a von 1000 mit b und c 1000英镑的新电影 诺伊尔电影公司 诺伊尔电影a mit b und c 诺伊尔电影a mit b und c und 我的正则表达式

  • 我有3个正则表达式,但当模式匹配时执行相同的操作,所以我考虑将所有三个表达式合并为一个。我尝试了很多,但无法让“|”I.e”或“在我的正则表达式中工作 regex1:<代码>文本。替换(/([\u00A9-\u3299])/g,函数myFunction(x){…} regex2: regex3: 我试过这样做,但它不起作用regex:

  • 当所有组都是可选的时,我在提取组时遇到了问题。 上下文(如果您愿意,可以跳到结尾):这是在将字符串与一堆正则表达式进行最佳匹配并查看哪个表达式具有最多组匹配的上下文中。 例如,我可能有一个潜在的格式; 但我希望用户打错字,或者不包含空格或其他东西。 所以我可以用绳子测试一下 并希望获得组 一个 光盘 1-1 G 而且,对于测试字符串 我想得到   DE   克 下面是我的正则表达式,用于匹配以下可