2017-03-31 25 views
2

我正在使用Ruby 2.4。我想说匹配一个包含3到4个连续数字的字符串。但我的大括号语法不起作用为什么我的范围正则表达式语法不起作用?

2.4.0 :034 > data = "1234" 
=> "1234" 
2.4.0 :035 > data =~ /\d{3, 4}/ 
=> nil 

什么是正确的方式来说这个?

+0

你举的例子只是正常的我吗?无可否认,我的回报是0,这是正确的,因为我的字符串在那个位置被发现,这就是你的测试返回的结果。你可以使用如图所示的锚点,但如果你有一个五位数的数字,其中包含一个带有3-4个数字的数字,它将不会显示锚点 – grail

+0

嗯,我读的问题是“match * full * string包含3到4个连续数字“。我编辑我的答案更加精确。 –

+0

使用bos/eos锚点是一个徒手使用的拐杖。 – sln

回答

3

取出limiting quantifier内部的空间:

data =~ /\d{3,4}/ 

如果你想在整个字符串组成的仅3至4位数字匹配,使用

data =~ /\A\d{3,4}\z/ 

详细

  • \A - 字符串开头
  • \d{3,4} - 3至4位数字
  • \z - 字符串结尾。

查看Rubular demo

+0

这是答案吗?这并不能解释为什么op正则表达式不匹配。 – sln

+2

哇@sln在这里燃烧一点似乎是这部分**“删除限制量词内部的空间:”** @种类涵盖了问题 – engineersmnky

0

你的正则表达式被解释为

\d{3,[ ]4} 

这就是为什么它不工作。

删除空格

你的正则表达式尝试匹配这个

\d  # digit 
{  # literal 
3  # literal 
,  # literal 
[ ]  # class 
4  # literal 
}  # literal 
+0

@EricDuminil指出,空白无知不会将文字变成限制性限定词。它只是意味着这将匹配'12 {3,4}'而不是 – engineersmnky

+0

'“1234”=〜/(?x:\ d {3,4})/#=>? – sln

+0

@sln是的,您是正确的不要忽略空白并改变上下文,它会忽略空白,同时保留匹配数和文字的上下文。这不是特定于ruby的[示例](https://regex101.com/r/XM9ybu/1)PCRE(Perl Compatible Regular Expressions)不能以这种方式工作,也不能使用python正则表达式。你能告诉我一种语言吗? – engineersmnky

相关问题