【问题标题】:Regex: Repeat pattern n times, with variation on final repetition正则表达式:重复模式 n 次,最终重复的变化
【发布时间】:2014-12-19 00:59:09
【问题描述】:

我有一个正则表达式,它旨在匹配特定的语法,n 次,每次出现后都有一个竖线 (|),除了最后一次出现。目前,我的模式是(pattern)\|{3},但这不满足没有尾随管道的要求。有没有我可以做到这一点无需重复(pattern)?我能想到的最佳解决方案是(pattern)\|{2}(pattern)

有效示例:

*|401|[2-10]

无效示例:

*|401|[2-10]|

(pattern) 的值与回答我的具体问题无关,但为了完整起见,这里是当前形式:(?:(?:((\*)|(\[[\w+ ]\-[\w+ ]\])|(\d+)))\|){3}

编辑

这是在 .NET 和 JavaScript 中使用的。

【问题讨论】:

  • 你能提供一个真实的例子吗?
  • 再说一次,我不认为这对实际问题非常重要,但这将是一个有效输入的示例:[1-2]|*|254
  • The best solution I can think of is (pattern)\|{2}(pattern). 在我看来这是最好的解决方案——您不必关心处理不匹配数量的模式和分隔符。为了防止重复,只需使用字符串连接来构建模式。

标签: javascript .net regex


【解决方案1】:

如果要匹配整个输入字符串,有一个简单的解决方案:

(?:pattern(?:\|(?!$)|$)){3}

这意味着:匹配你的 pattern 后跟:

  • \|(?!$):管道不是后跟字符串结尾
  • $字符串的结尾

3 次。


对于您的特定模式,这将是:

^(?:(?:((\*)|(\[[\w+ ]\-[\w+ ]\])|(\d+)))(?:\|(?!$)|$)){3}

我还在模式前面加上了^,因为这个解决方案只有在你匹配整个输入时才有效。

【讨论】:

  • 但是这匹配后面有|的那个
  • 我选择了这个解决方案,因为它(对我来说)更容易理解。谢谢!
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2019-09-05
相关资源
最近更新 更多