【问题标题】:regex to start with a capturing group正则表达式以捕获组开始
【发布时间】:2017-10-10 02:46:57
【问题描述】:

我有这个正则表达式来匹配以下模式:

/(((fall|spring|summer)\s\d{4});|(waived)|(sub\s[a-zA-Z]\d{3}))/ig

应该匹配:

fall 2000;
spring 2019; waived
summer 1982; sub T676

不应匹配不以第一个捕获组((fall|spring|summer)\s\d{4})开头的ANY字符串,例如:

waived Fall 2014;
sub Fall 2011; waived

确保每个匹配模式都以此组开头((fall|spring|summer)\s\d{4}) 我尝试在第一组前面添加^ 这样/(^((fall|spring|summer)\s\d{4});|(waived)|(sub\s[a-zA-Z]\d{3}))/ig,但结果不一致。

Demo

【问题讨论】:

  • 结果不一致”不是问题描述。见minimal reproducible example
  • 演示链接......
  • stackoverflow.com/help/how-to-ask:如果可以创建一个可以链接到的问题的实时示例(例如,在sqlfiddle.comjsbin.com),那么就这样做 - 但是 还将代码包含在您的问题本身中
  • \s{1} 在功能上与\s 相同,但有些人更喜欢在视觉上更明确。我不喜欢它,但它向读者强调恰好一个,所以它做了某事。这是否是一件好事是有争议的,但我不会为此敲别人。
  • 您在括号中包含^ 的任何特殊原因?

标签: javascript regex pattern-matching


【解决方案1】:

你可以使用

/^(fall|spring|summer)\s\d{4};(?:.*(waived|sub\s[a-zA-Z]\d{3}))?/i

请参阅regex demo

详情

  • ^ - 字符串开头
  • (fall|spring|summer) - 三种选择之一
  • \s - 一个空格
  • \d{4} - 4 位数字
  • ; - 分号
  • (?:.*(waived|sub\s[a-zA-Z]\d{3}))? - 可选序列:
    • .* - 除换行符之外的任何 0+ 字符,尽可能多(如果您需要的值更接近字符串的开头,请替换为惰性 .*? 对应值)
    • ( - 分组结构的开始
      • waived - waived 子字符串
      • | - 或
      • sub - sub 子字符串
      • \s - 一个子字符串
      • [a-zA-Z] - 一个 ASCII 字母
      • \d{3} - 三位数
    • ) - 分组结构结束。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多