我想使用具有两种替代格式的 javascript 解析字符串:
id#state#{font name, font size, "text"}
// e.g. button1#hover#{arial.ttf, 20, "Ok"}
或者
id#state#text
// e.g. button1#hover#Ok
在第二个变体中,假定默认字体和大小。
在您进一步阅读之前,我必须指出我控制格式,所以我很想听听任何其他更符合 RegExp Friendly™ 的格式。话虽如此,出于历史原因,需要第二种选择,id#state#
-part也是如此。换句话说,灵活性在于{font name, font size, "text"}
-part。
此外,我想尽可能使用 RegExp。是的,我在下面建议的 RegExp 非常多毛,但就我而言,这不仅是解决手头问题的可能解决方案,而且也是了解更多关于 RegExp 本身的问题。
我目前对两种格式的三个或五个信息元素进行分组的尝试如下。
var pat = /^(\w*)#(\w*)#
(?:(?:\{([\w\.]*),\s*([0-9\.]*),\s*"([\w\s]*)"\})|([\w\s]*))$/;
var source1 = "button1#hover#{arial.ttf, 20, \"Ok\"}";
var source2 = "button1#hover#Ok";
var result1 = source1.match ( pat );
var result2 = source2.match ( pat );
alert ( "Source1: " + result1.length + " Source2: " + result2.length );
当我在http://www.regular-expressions.info/javascriptexample.html测试这个表达式时,我得到:
result1 = [ button1#hover#{arial.ttf, 20, "Ok"}, button1, hover, arial.ttf,
20, Ok, undefined ]
和
result2 = [ button1#hover#Ok, button1, hover, undefined,
undefined, undefined, Ok ]
这是我分解正则表达式的方法:
^(\w*)#(\w*)#(?:(?:\{([\w\.]*),\s*([0-9\.]*),\s*"([\w\s]*)"\})|([\w\s]*))$
^ # anchor to beginning of string
(\w*) # capture required id
# # match hash sign separator
(\w*) # capture required state
# # match hash sign separator
# capture text structure with optional part:
(?:(?:\{([\w\.]*),\s*([0-9\.]*),\s*"([\w\s]*)"\})|([\w\s]*))
$ # anchor to end of string
我猜,文本结构捕获是最狡猾的部分。我将其分解如下:
(?: # match all of what follows but don't capture
(?:\{ # match left curly bracket but don't capture (non-capturing group)
([\w\.]*) # capture font name (with possible punctuation in font file name)
,\s* # match comma and zero or more whitespaces
([0-9\.]*) # capture font size (with possible decimal part)
,\s*" # match comma, zero or more whitespaces, and a quotation char
([\w\s]*) # capture text including whitespaces
"\}) # match quotation char and right curly bracket (and close non-capturing group)
| # alternation operator
([\w\s]*) # capture optional group to match the second format variant
) # close outer non-capturing group
我的问题有两个:
1)如何避免在 result1 情况下出现尾随未定义匹配?
2)如何避免 result2 案例中间的三个未定义匹配?
奖金问题:
我理解错了吗?(我想有些不对劲,因为 RegExp 没有完全按预期工作。)
谢谢!:)