我正在尝试构建一个与BBCode属性匹配的正则表达式。我希望它匹配没有引号(attr=value
)的属性以及它们(attr="value"
)的属性,但如果只有一个标记(attr="value
或attr=value"
则不匹配)。
我设法使用这个正则表达式/\[size\=((?=")"(.*?)"|([^"]*))\](.*?)\[\/size\]/is
(对于大小标签)接近使用前瞻的解决方案,但它将引用和不引用属性的匹配放在不同的索引上。这是一个计划:
+-----------------------+----------+----------+----------+----------+
| Input | Match #1 | Match #2 | Match #3 | Match #4 |
+-----------------------+----------+----------+----------+----------+
| [size="7"]txt[/size] | "7" | 7 | | txt |
+-----------------------+----------+----------+----------+----------+
| [size=7]txt[/size] | 7 | | 7 | txt |
+-----------------------+----------+----------+----------+----------+
虽然这不是一个主要问题,但我想知道是否有任何wya将它们与同一索引相匹配。
背景信息:
基本上,我正在努力改进BBCode解析器。至于现在,它只允许放置没有引号"
的属性。现在,这给它带来了很多限制,所以我添加了对引用属性的支持。问题是我不能破坏向后兼容性,所以我想得出适用于这两种情况的东西。
答案 0 :(得分:1)
由于与您的第一个案例匹配的组必须与匹配第二个案例的组不同,我不相信有任何方法可以让它们与相同的索引/组匹配。
看到代码解决这个问题并不罕见,如下所示:
attr = matches[1] or matches[2]
由于您可以确定这些元素中至多有一个非空,因此or
逻辑可以正常工作。