我正在尝试找到一个匹配C ++整数后缀的合适表达式,即cppreference之后:
整数后缀(如果提供)可以包含以下一个或两个> (如果两者都提供,它们可以按任何顺序出现:
- unsigned-suffix(字符u或字符U)
- long-suffix(字符l或字符L)或long-long-suffix(字符序列ll或字符序列LL)(自C ++ 11起)
截至目前,我能够写出的最佳模式是
/u?(ll|l)?u?/i
但是这将匹配uu
,这是标准不允许的......是否有更好的正则表达式?
修改
在我正在研究的词法分析器中,我们按如下方式解析整数(C规则,C ++规则类似):
rule /\d+[lu]*/i, Num::Integer
rule /0[0-7]+[lu]*/i, Num::Oct
rule /\d+[lu]*/i, Num::Integer
可以看出,后缀的匹配与标准中定义的匹配要多得多。我的目标是将其重写为:
isuffix = /u?(ll|l)?u?/i
rule /\d+#{isuffix}/i, Num::Integer
rule /0[0-7]+#{isuffix}/i, Num::Oct
rule /\d+#{isuffix}/i, Num::Integer
答案 0 :(得分:2)
Pure Ruby ... U knoL
%w(u ul ull l ll llu).include? suffix.downcase
但如果你坚持:
/u?ll?|l?l?u/i
u
之前处理l
并需要l
。u
之后处理l
并需要u
。如果您想要包含空后缀,可以为这些字符添加可选匹配。
请注意,如果后缀中有剩余部分,则预计词法分析器将失败。
答案 1 :(得分:1)
使用否定前瞻强制失败。 例如:
/(?!u(ll|l)?u)u?(ll|l)?u?/i
或
/(?!ul*u)u?l{0,2}u?/i
答案 2 :(得分:1)
我的价值2美分:有时它只是显而易见而不是试图过于花哨。我认为这是其中一次。这是我的正则表达式:
/(?<=\d)(u|ul|ull|l|lu|ll|llu)(?=([^ul]|$))/i
这个想法很简单......
答案 3 :(得分:1)
如果你正在寻找后缀,以便/\d('?\d)*#{suffix}/
匹配十进制整数,你可以使用:
suffix = /(ul?l?|ll?u?)?\b/i
Here是一个Rubular示例。它与1
中的l1
和11
中的c++11
相匹配,因为\d
之前没有任何后盾。
这将在字符串中的任何位置找到非空后缀:
/(?<![a-z])(ul?l?|ll?u?)\b/i
这意味着:
u
,ul
,ull
或l
,ll
,lu
或llu
后跟一个单词边界,后面跟着另一个字母。
其他没有边界的答案与"uu"
相匹配。
Here是一个Rubular示例。
如果您的字符串只是后缀,并且您想检查它是否正确:
/^(ul?l?|ll?u?)?$/i
Here是另一个例子。