regex - 如何匹配由'+'-符号分隔的n个字符长字符串?
问题描述
我正在使用这个正则表达式(\(?(F[0-9]{3}\+?\-?)+([a-zA-Z0-9]{3}\+?\-?)*\)?v?)+
。
我要匹配的字符串示例:
- F123
- F123+098
- F123+YY
- F123+F456+890+456
- F123+F456+890+-456
- (F123+F456+890+456)v(F123)
- (F123+F456+890+456)v(F123+098)
我不想匹配的字符串示例:
- F1234+
- F123+
- F123+098+
- F123+456789
- (F123+F456+890+456)vF123)
- (F123+F456+890+456)v(F123+09898)
- (F123+F456+890+456)v(F123+098
我认为我需要某种负面的前瞻性来确保+
如果我匹配第二组或者)v(
如果我匹配一个新实例,则在两者之间存在一个,但我似乎无法弄清楚如何。
我还想确保它仅在整个输入与正则表达式匹配时才匹配。
解决方案
也许一种选择是使用重复组和交替来匹配没有左括号和右括号的部分,并匹配带有 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 次\)
匹配)
)
关闭非捕获组$
字符串结束
推荐阅读
- python - 为什么 SeparableConv2D 比 Conv2D 慢?
- ansible - 使用另一个 dict var 创建 var
- python - 使用 selenium 的 Web 驱动程序获取冠状病毒数据的问题
- python - 安装像 pygal 这样的模块,以便它们在 Spyder 中工作
- node.js - 无法使用 azure 函数更新许多值 - nodejs
- android - BUILD FAILED in 18s Finished with error: Gradle task assembleDebug failed with exit code 1
- reactjs - 为什么引导按钮组件中的链接不起作用?
- neo4j - 在 Where 子句中引入的 Neo4j 索引
- neo4j - Get all nodes with relationships
- c# - Sharing variable data back and forth between scripts