首页 > 解决方案 > 如何匹配由'+'-符号分隔的n个字符长字符串?

问题描述

我正在使用这个正则表达式(\(?(F[0-9]{3}\+?\-?)+([a-zA-Z0-9]{3}\+?\-?)*\)?v?)+

我要匹配的字符串示例:

我不想匹配的字符串示例:

我认为我需要某种负面的前瞻性来确保+如果我匹配第二组或者)v(如果我匹配一个新实例,则在两者之间存在一个,但我似乎无法弄清楚如何。

我还想确保它仅在整个输入与正则表达式匹配时才匹配。

也许有帮助:https ://regexr.com/4irbv

标签: regex

解决方案


也许一种选择是使用重复组和交替来匹配没有左括号和右括号的部分,并匹配带有 v 介于两者之间的括号的部分。

^(?:F[0-9]{3}(?:\+-?F[0-9]{3})*(?:\+-?[0-9a-zA-Z]{3})*$|\(F[0-9]{3}(?:\+-?F[0-9]{3})*(?:\+-?[0-9a-zA-Z]{3})*\)v\(F[0-9]{3}(?:\+-?F[0-9]{3})*(?:\+-?[0-9a-zA-Z]{3})*\))$

在零件

  • ^字符串的开始
  • (?:非捕获组
    • F[0-9]{3}匹配 F 和 3 位数字
    • (?:\+-?F[0-9]{3})*重复 0+ 次 a +, optional -, F 和 3 位数字
    • (?:\+-?[0-9a-zA-Z]{3})*重复 0+ 次 a +,可选-和 3 次列出的任何一个
  • |或者
    • \(匹配(
    • F[0-9]{3}匹配 F 和 3 位数字
    • (?:\+-?F[0-9]{3})*重复 0+ 次+,可选-,F 和 3 位
    • (?:\+-?[0-9a-zA-Z]{3})*匹配 0+ 次+,可选-和列出的任何 3 次
    • \)v\(匹配)v(
    • F[0-9]{3}匹配 F 和 3 位数字
    • (?:\+-?F[0-9]{3})*匹配 0+ 次+,可选-,F 和 3 位数字
    • (?:\+-?[0-9a-zA-Z]{3})*匹配 0+ 次+,可选-和列出的任何 3 次
    • \)匹配)
  • )关闭非捕获组
  • $字符串结束

正则表达式演示


推荐阅读