Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby “意外正则表达式警告”;警告:字符类具有重复的范围;_Ruby_Regex - Fatal编程技术网

Ruby “意外正则表达式警告”;警告:字符类具有重复的范围;

Ruby “意外正则表达式警告”;警告:字符类具有重复的范围;,ruby,regex,Ruby,Regex,在Ruby 1.9.3上运行以下程序时,我收到一个意外警告: "one two,three;four\rfive\nsix\r\nseven,;\r\n,;\r\neight".split(/[,|;|\r\n]+/m) 我收到的警告是: warning: character class has duplicated range: /[,|;|\r\n]+/ 我得到了我期望的结果-一个如下所示的数组: [ [0] "one two", [1] "three", [2] "four

在Ruby 1.9.3上运行以下程序时,我收到一个意外警告:

"one two,three;four\rfive\nsix\r\nseven,;\r\n,;\r\neight".split(/[,|;|\r\n]+/m)
我收到的警告是:

warning: character class has duplicated range: /[,|;|\r\n]+/
我得到了我期望的结果-一个如下所示的数组:

[
  [0] "one two",
  [1] "three",
  [2] "four",
  [3] "five",
  [4] "six",
  [5] "seven",
  [6] "eight"
]
我想了解的是,是什么导致了重复范围警告?我无法通过删除三个匹配器选项中的一个来获得相同的结果,因此我无法理解警告


谢谢你的帮助

看起来你把事情搞混了。 它当前与以下任一项匹配:

  • ,
  • |
  • )
  • \r
  • \n
在character类中有两次管道(|)

要使警告消失,请改用以下命令:
/[,|;\r\n]+/
。注意:只有一个管道

但我想你真正想要的是:
/(,| | | |\r |\n)+/
/[,;\r\n]+/

这与以下内容相匹配:

[
  [0] "one two",
  [1] "three",
  [2] "four",
  [3] "five",
  [4] "six",
  [5] "seven",
  [6] "eight"
]
  • ,
  • )
  • \r
  • \n

看起来你把事情搞混了。 它当前与以下任一项匹配:

  • ,
  • |
  • )
  • \r
  • \n
在character类中有两次管道(|)

要使警告消失,请改用以下命令:
/[,|;\r\n]+/
。注意:只有一个管道

但我想你真正想要的是:
/(,| | | |\r |\n)+/
/[,;\r\n]+/

这与以下内容相匹配:

[
  [0] "one two",
  [1] "three",
  [2] "four",
  [3] "five",
  [4] "six",
  [5] "seven",
  [6] "eight"
]
  • ,
  • )
  • \r
  • \n

啊,对了!我重构的原始表达式看起来是这样的
/[,| | | \n | \r\n]+/m
,因此我错误地假设管道的行为类似于和
。在字符类中,它们不充当或+1,但实际上我认为最初的意图是匹配
\r\n
。您的正则表达式也将匹配
\r\r\r
,但我认为这在实践中并不重要…@TimPietzcker:我一开始也这么认为,但看看这个问题。在
四个
五个
之间只有
\r
,OP希望他们分开。啊,对了!我重构的原始表达式看起来是这样的
/[,| | | \n | \r\n]+/m
,因此我错误地假设管道的行为类似于和
。在字符类中,它们不充当或+1,但实际上我认为最初的意图是匹配
\r\n
。您的正则表达式也将匹配
\r\r\r
,但我认为这在实践中并不重要…@TimPietzcker:我一开始也这么认为,但看看这个问题。在
四个
五个
之间只有
\r
,OP希望它们分开。顺便说一下,你不需要
m
修饰符,因为你的正则表达式中没有
的行为会受到影响。@TimPietzcker!谢谢我从这一个问题中学到了不少。顺便说一下,你不需要
m
修饰符,因为你的正则表达式中没有
的行为会受到它的影响。@TimPietzcker真的!谢谢我从这个问题中学到了不少东西。