【问题标题】:Regex with optional word inside string字符串中带有可选单词的正则表达式
【发布时间】:2019-08-30 21:11:31
【问题描述】:

我尝试正则表达式以下行(每个单词用一个空格分隔):

Firstpartstring thisisoptional secondpartstring

我希望每个字符串作为组匹配:

Group 1.    Firstpartstring
Group 2.    thisisoptional
Group 3.    secondpartstring

这是我迄今为止尝试过的:

(.*?)\s(thisisoptional)?\s(.*)

唯一的问题是,如果字符串中不存在“thisisoptional”,我不会得到任何结果。

我希望:

Group 1.    Firstpartstring
Group 2.    
Group 3.    secondpartstring

请查看此演示:https://regex101.com/r/YBlYXm/1

谁能指引我正确的方向?

谢谢

【问题讨论】:

  • 演示和你尝试的完全不同
  • 抱歉,链接已修复
  • 这是可选的常量字符吗?
  • 您的正则表达式需要空格,而您可能还想将其中至少一个设为可选?
  • 很遗憾没有,所以一个通用的解决方案会很棒

标签: regex string optional word


【解决方案1】:

您的问题是您在 Regex 中要求两个空格 (\s),如果 thisisoptional 不包括在内,这与您的情况不匹配。简单的解决方法是在第二个捕获组中包含第二个空格:

(.*?)\s(thisisoptional\s)?(.*)

this 选择后跟 thisisoptional 的任何内容,然后选择任何内容

【讨论】:

  • 谢谢。我用这个:)
  • 请记住,对于这个答案,第二组总是捕获一个尾随空格,这可能不一定是您想要的。
  • 确实,根据您要执行的操作,您可能需要根据您的格式在末尾或中间添加更多/更少的空格。只是在旅途中要记住的事情
【解决方案2】:

可选词之前的空格也应该是可选的;否则,第一个和最后一个单词之间需要两个空格才能匹配:

(.*?)(?:\s(thisisoptional))?\s(.*)

https://regex101.com/r/YBlYXm/2

【讨论】:

  • 谢谢。这是有道理的:)
【解决方案3】:

您不能将所有非空白字符与(\S+) 组合在一起,然后在获得三个匹配项时删除中间的一个吗?

此正则表达式运行示例:https://regex101.com/r/IIyM5Z/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多