如何使占位符<value>不干扰正则表达式匹配(含复杂场景)
骰子表达式正则适配占位符需求
我有一套用于匹配骰子表达式的正则规则,示例正则^\d*d\d*([+-]\d+)?$可匹配2d20+1、d+7这类格式。现需修改正则,使得在字符串任意位置插入占位符(格式为<xxx>,支持带下划线的变体如<value_1>、<abs_1>)后,仍能被修改后的正则匹配,无需提前替换占位符为空,用于JSON Schema的字符串有效性验证。注意不能用.*匹配任意内容,仅需保证占位符本身不干扰原表达式的匹配逻辑,例如6d3<value>6-<value>4这类字符串应当能被匹配。
简单正则场景
原正则:
^\d*d\d*([+-]\d+)?$
测试用例:
""→ 不匹配"<value>d<value>2<value>0+<value>"→ 应匹配(当前不匹配)"2d20+1"→ 匹配"2d<value>+1"→ 应匹配(当前不匹配)"<value>d10+1"→ 应匹配(当前不匹配)"d"→ 匹配"d<value>"→ 应匹配(当前不匹配)
实际复杂正则场景
原正则:
^[+-]?(?:\([+-]?)*(?:(?:\d*d\d*(?:(?:km(?![^d]*(?:e|km))|k(?![^d]*(?:e|k(?:[^m]|$)))|ei(?![^d]*(?:ei|k))|e(?![^d]*(?:e(?:[^i]|$)|k))|(([<>])\2)(?![^d]*\1)|([+\-*\/%])\3)\d*)*|\d+|f\d*)\)*(?:$|[+\-*\/%](?=[\ddf(]))(?:\([+-]?)*)+$
测试用例:
""→ 不匹配"d20+5"→ 匹配"d20+f5+4d10k5+5d20km10k5"→ 匹配"d20++5/f5+f-4d10k5--5+5d20ei10"→ 匹配"<value_1>d20++<value_2>-<abs_1>*<math_<abs_1>-2>"→ 应匹配(当前不匹配)"1<value_1>d20**2<value_2>-<abs_1>*<math_<value_10>-2>"→ 应匹配(当前不匹配)"1d20e<value_1>i10-1d20ek<value_1>m10"→ 应匹配(当前不匹配)
内容的提问来源于stack exchange,提问作者Semanual
相关产品推荐
相关产品推荐

