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

在正则表达式中的两个“任何”组之间是否可以有一个可选组?[重复]

段干楚青
2023-03-14

我有一个regex语句,如下所示:

<代码>(。*)_(ce)_(。*)_([0-9]{8}).([A-Za-z]{1,20})(?:\\.[A-Za-z]{1,20})?

它应该将(任何东西)_(ce)_(任何事物)_(某些数字).(some_ext).(some_possible_ext)分组。

因此,这是一个可能的传递字符串:

hello_ce_world_192212.json.xml

这些群体是:

1. hello
2. ce
3. world
4. 20192212
5. json
6. xml

我现在想使(ce)成为可选的,并使正则表达式如下所示:

.*)_(ce_)?(.*)_([0-9]{8}).([A-Za-z]{1,20})(?:\\.[A-Za-z]{1,20})?

这样就会通过:hello_ce_world_20192212.json.xml,组将是:

1. hello
2. ce
3. world
4. 20192212
5. json
6. xml

这将传递:hello_world_20192212.json.xml,组将是:

1. hello
3. world
4. 20192212
5. json
6. xml

所以,正则表达式有效!问题是,当(ce_)出现在正在评估的文本中时,它包含在第一组中。因此,hello_ce_world_20192212.json.xml 传递正则表达式,但组是:

1. hello_ce
3. world
4. 20192212
5. json
6. xml

这违反了我上面提到的约束。不确定如何修复正则表达式以使其执行此操作;我怀疑,因为它位于两个(.*)组之间,所以它不起作用,或者我的正则表达式需要更具体。只要从逻辑上思考一下,我就会明白,我不太可能达到我想要的目标……但也许有人会有更多的理解。有什么帮助吗?

我发现这个网站对测试哪些群体在哪里和东西很有帮助。

共有1个答案

沈皓君
2023-03-14

您可以使用使第一个组捕获一个非贪婪的组 。此正则表达式应满足您的需要:

(.*?)_(ce)?_?(.*)_([0-9]{8})\.([A-Za-z]{1,20})?\.([A-Za-z]{1,20})?

经 https://regex101.com/r/MZqDPd/3 测试

还请注意调整,使ce可选,但不需要_。这会导致其中一个可能丢失,但仍然传递正则表达式的情况。请注意这一点。

 类似资料:
  • 我使用这个正则表达式: 要匹配这样的字符串: 分为4组: 问:我如何使第一个组可选,使结果组是一个空字符串? 我想在每种情况下得到4组,如果可能的话。 这种情况下的输入字符串:(第一组后面没有下划线)

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

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

  • 问题内容: 我有一个有效的正则表达式: 我也有一个正则表达式: 但是我不知道如何将两者结合起来 我试过了,但实际上没有用… 如果重要的话,这就是Java正则表达式中的全部内容。 问题答案: 如果您想要匹配以或开头的序列的正则表达式,请尝试以下操作: 但是除了周围的两个空格字符外,您的正则表达式也应该与之匹配: 这两个正则表达式匹配同一组字符串。

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

  • 我正在尝试编写一个正则表达式,使其只有两个单词,它们之间只有一个空格。两个字都不能少于三个字符。例子:乔·史密斯