【问题标题】:Extract only <string>/<string> or <string> after specific word仅在特定单词后提取 <string>/<string> 或 <string>
【发布时间】:2019-04-29 03:24:50
【问题描述】:

我正在尝试构建一个正则表达式,它可以很好地提取字符串的特定部分。 我可以收到如下所示的字符串:

  • UserA 待合并修补程序/待做的任务
  • UserB 待合并功能/taskC_expansion 已完成
  • UserC 待合并做
  • UserD 等待合并修补程序做

Pending Merge 后面的字符串基本上是一个分支名称。

如何在 Pending Merge 词之后提取分支名称,以便它也适用于字符串不是 / 并且只有“修补程序”的情况?

我可以处理在 Pending Merge 之后没有分支名称但如果所有的正则表达式都存在的情况,那就太好了

我试过了:
[^pending merge].(\w*) 第一个单词与“to”一起匹配。
pending merge(.\w+\W+\w+) 但如果是“pending merge hotfix to do”,它匹配“hotfix to”

【问题讨论】:

  • 试试/pending merge\s*(.*?)\s*(?:to do|done)/i,见demo
  • 这个解决了,非常感谢

标签: javascript regex


【解决方案1】:

你可以使用

/pending merge\s*(.*?)\s*(?:to do|done)/i

请参阅regex demo

详情

  • pending merge - 文字子串
  • \s* - 0+ 个空格
  • (.*?) - 捕获组 1:除换行符之外的任何 0+ 字符,尽可能少
  • \s* - 0+ 个空格
  • (?:to do|done) - to dodone

JS 演示:

var strs = ['UserA Pending Merge hotfix/taskA to do',
'UserB Pending Merge feature/taskC_expansion done',
'UserC Pending Merge to do',
'UserD Pending Merge hotfix to do'];
var regex = /pending merge\s*(.*?)\s*(?:to do|done)/i;
for (var s of strs) {
  console.log(s);
  var m = s.match(regex);
  if (m) {
    console.log("FOUND: ", m[1]);
  }
}

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式,

    Pending Merge\s+(\S+\/\S+|hotfix\b)
    

    并从 group1 中捕获您的分支

    没有string1/string2这种格式的字符串的字符串将不匹配,我希望这是你所期望的。

    Regex Demo

    var arr = ['UserA Pending Merge hotfix/taskA to do','UserB Pending Merge feature/taskC_expansion done','UserC Pending Merge to do','UserD Pending Merge hotfix to do']
    
    for (s of arr) {
      var m = /Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)
      if (m != null) {
    	  console.log(s + " --> " +/Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)[1])
      } else {
        console.log('No branch found')
      }
    }

    【讨论】:

    • 对不起,也许我应该清楚地解释它,在只有“修补程序”的情况下它应该匹配它。
    • @Arin:好的,处理起来很简单。只是片刻。如果字符串的格式不是string1/string2,那么您只想匹配hotfix?或者更多的东西?您能否在您的帖子中添加此示例和预期行为?
    • @Arin:已更新以捕获修补程序。让我知道这是否可以正常工作,如果您有任何其他捕获其他逻辑的逻辑,请告诉我。
    【解决方案3】:

    This simple RegEx 可能会帮助您这样做:

    User[A-Z] Pending Merge\s(.+)
    

    它只会在使用时创建一个左边界:

    User[A-Z] Pending Merge\s
    

    并在使用此捕获组(.+) 后提取所有内容。

    如果您愿意,可以向该组添加额外的边界。

    (User[A-Z]{1} Pending Merge\s)(.+|)(?:to\sdo|done)
    

    然后,您可以将其简化为类似于this RegEx

    User[A-Z]{1} Pending Merge\s(.+|)(to\sdo|done)
    

    您可以使用 $1 来调用它,这是第一个具有所需目标的捕获组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多