【问题标题】:Regex match string before and after a specific character正则表达式匹配特定字符前后的字符串
【发布时间】:2018-02-16 22:29:00
【问题描述】:

我想进行分组以选择特定字符之前和之后的字符串,在本例中是冒号。

例子:

First: foo Last: bar

我想匹配第 1 组中的 First 和 foo 以及第 2 组中的 Last bar

组 1:First foo

第二组:Last bar


我现在有

([^:]*)+([^:*])

它只匹配所有不是冒号的东西,这不是我要找的东西。我可以在某个字符之前和之后匹配正则表达式的哪些方式或模式?

【问题讨论】:

  • @WiktorStribiżew 使用非捕获组来获得所需的匹配可能会稍微好一些:(?:[^:]+):\s*(.*?)(?=\w+:|$)
  • 如果你想将它们归为一组,恐怕你将不得不使用replace
  • @Tibrogargan 好吧,我不太确定所需的输出。看起来第 1 组应该是 First foo,这是不可能的,因为文本不连续。请参阅this JSFiddle,您仍然可以使用上面的正则表达式,但将这些组加入到一起。
  • 你忘了在你的regex 中输入那个“特定的字符”。

标签: javascript regex performance


【解决方案1】:

由于您希望删除冒号,但仍将周围的文本放在一组中,因此您需要在执行正则表达式后使用一些字符串操作:

var s = "First: foo Last: bar",
    re = /\s*([^:]*?)\s*:\s*([^:\s]*)/g,
    result = [];
while (match = re.exec(s)) {
    result.push(match[1] + ' ' + match[2]);
}

console.log(result);

请注意,当有更多空格时,例如在First: foo hello there: bar 中,哪个单词属于哪个位置可能是不明确的。

【讨论】:

    【解决方案2】:

    你想进入单个组的文本不是一串连续的字符,因此是不可能实现的。你需要分别抓取key和value这两个部分,然后加入它们:

    var rx = /([^:]+):\s*(.*?)(?=\w+:|$)/g;
    var s = "First: foo Last: bar";
    var m, res=[];
    while (m=rx.exec(s)) {
      res.push([m[1].trim(),m[2].trim()].join(" "));
    }
    console.log(res);

    请参阅regex demo at regex101.com。详情:

    • ([^:]+) - 第 1 组:: 以外的一个或多个字符
    • : - 一个:
    • \s* - 0+ 个空格
    • (.*?) - 第 2 组:除换行符之外的任何 0+ 字符,尽可能少
    • (?=\w+:|$) - 后跟 1+ 个单词字符和 : 或字符串结尾。

    【讨论】:

    • 只是出于好奇,您为什么使用? 登录(.*?)?为什么不直接使用 (.*) ,只是想知道。谢谢
    • @AlexanderSolonik 查看this demo 并与one in the answer 进行比较。 .*? 将匹配除换行符之外的任何 0+ 字符,尽可能 few 并且.* 将匹配除换行符之外的任何 0+ 字符,例如 many 尽可能。请注意,我的正则表达式将为 First: foo hello there: bar 输入返回 [ "First foo hello", "there bar"]
    【解决方案3】:

    您可以使用以下正则表达式:

    ([a-zA-Z]+:\s*[a-zA-Z]+) 
    

    您可以在链接 HERE 上试用。

    'First: foo Last: bar'.match(/([a-zA-Z]+:\s*[a-zA-Z]+)/g) // ["First: foo", "Last: bar"]
    

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多