正则表达式以任何顺序匹配none,one,other或both

时间:2016-12-08 15:23:33

标签: ruby regex

我正在尝试找到一个匹配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

4 个答案:

答案 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

如果您想要包含空后缀,可以为这些字符添加可选匹配。

请注意,如果后缀中有剩余部分,则预计词法分析器将失败。

See it in action

答案 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中的l111中的c++11相匹配,因为\d之前没有任何后盾。

旧答案

这将在字符串中的任何位置找到非空后缀:

/(?<![a-z])(ul?l?|ll?u?)\b/i

这意味着:

  • uulull
  • llllullu

后跟一个单词边界,后面跟着另一个字母。

其他没有边界的答案与"uu"相匹配。

Here是一个Rubular示例。

如果您的字符串只是后缀,并且您想检查它是否正确:

/^(ul?l?|ll?u?)?$/i

Here是另一个例子。