在ruby或变通方法中具有可变组数的正则表达式

在ruby或变通方法中具有可变组数的正则表达式,ruby,regex,svg,Ruby,Regex,Svg,我知道正则表达式,但既然在C中似乎有一种方法可以做到这一点,我想问是否有任何方法可以在ruby中实现这一点?我对ruby没有任何深入的了解,所以我自己也不能真正解决这个问题 如果不可能,有没有办法改变我的逻辑,这样我就能得到我想要的 我想做的是解析SVG文件的bezier信息 这是我的正则表达式: /(C)\s*(?:(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)[-,\s]{1}){5,}/ 下面是SVG的一个示例: <path d="M 15.43,29.45

我知道正则表达式,但既然在C中似乎有一种方法可以做到这一点,我想问是否有任何方法可以在ruby中实现这一点?我对ruby没有任何深入的了解,所以我自己也不能真正解决这个问题

如果不可能,有没有办法改变我的逻辑,这样我就能得到我想要的

我想做的是解析SVG文件的bezier信息

这是我的正则表达式:

/(C)\s*(?:(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)[-,\s]{1}){5,}/
下面是SVG的一个示例:

<path d="M 15.43,29.45 C 23.73,28.89 38,25.96 44.2,25.42 46.48,25.22 47.41,27 47.16,29.29 46.59,34.67 45.5,46 44.14,53.63"/>
<path d="M 16.91,41.07 C 19.61,40.8 36.25,38.5 45.64,37.7"/>
<path d="M70.28,15.94c1.21,1.21,1.24,2.32,1.24,3.97c0,7.59-0.01,55.22-0.01,60.22C71.5,91,73,92.23,83.94,92.23c10.31,0,11.56-1.73,11.56-8.68"/>
<path d="M72.67,56.84c0.04,0.3,0.08,0.77-0.07,1.19C-0.9,2.52-6.07,8.03-13.15,11.41"/>

贝塞尔曲线可以有6*n个点。 我的正则表达式匹配C和5个连续点(我不需要第6个),如果超过6个,则重复。当我像这样匹配它时,它只会给我贝塞尔曲线的第五个点,而不是所有的点

那么现在,ruby中是否有一个特性允许我不必每次都覆盖这个组

如果没有,是否有其他方法匹配可变长度贝塞尔曲线的每个点?我可以重复100次正则表达式a的点匹配例程,以匹配大多数真实世界的情况,但这将是愚蠢和难以处理的


我的ruby版本是1.9.3,如果不破坏任何兼容性,更新就没有问题。

您的示例没有明确说明为什么需要正则表达式中的C。这到底是为什么?还有其他地方可以连续获得6+分吗

你喜欢这个工作吗

(?:[\.\d]+\,[\.\d]+\s*?){5,5}


无论如何,这一版本使用rubular上1.93版的
\G
构造工作。
在一场比赛中,它抢到前5分,跳过第6分,然后重复

以下两名人士在以下两次代码><<代码>(以下以下两名::(以下两名::(以下以下两名::(以下两名:(以下两名:(以下两名:(以下两名::(以下两名::(以下两名::(以下两名::(以下两名::)在以下两名:(以下以下两名:(以下以下两名:::(以下以下两名:::::::))在((以下以下以下以下两名:(以下以下以下?????????)::(以下以下以下以下以下以下?????)::::(以下以下以下以下以下????????????????????):::::::::::::::::::::::::::::)))))在???????????????????????:[-,\s]-?\d+(?:\。\d+)(?:[eE][+-]?\d+)?

解释

 (?:
      (?! ^ )                       # Not BOS
      \G                            # Start where last match left off to get next 5  pts.
      [-,\s]                        # required separator
   |                             # or,
      C                             # C - the start of a block of pts.
 )
                               # The first/next 5 pts. captured
 \s* 
 (                             # (1 start)
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )                             # (1 end)
 [-,\s] 
 (                             # (2 start)
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )                             # (2 end)
 [-,\s] 
 (                             # (3 start)
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )                             # (3 end)
 [-,\s] 
 (                             # (4 start)
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )                             # (4 end)
 [-,\s] 
 (                             # (5 start)
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )                             # (5 end)

 (?:                           # Skip the 6th pt.
      [-,\s] 
      -? \d+ 
      (?: \. \d+ )?
      (?: [eE] [+-]? \d+ )?
 )?

虽然有一种正则表达式方法可以将它们全部提取出来(请参阅),但我认为一定有一种更简单的非正则表达式方法。您可能希望使用实际的SVG解析器,而不是一些密集的正则表达式。任何执行此功能的解析器都会有代码,您至少可以为您的应用程序重新调整用途。我认为值得一提的只是一个小小的警告:“重复捕获组将只捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣(如上所述),则使用一个非捕获组将坐标作为对,请参见此处,5个匹配组
{5,5}
是冗余的-
{5}
就足够了。此外,点不需要在字符类中转义。
\s*?
也是冗余的。因此您的表达式可以归结为:
(?:[.\d]+\,[.\d]+\s*){5}
我只想匹配Cs,因为我需要转换它们。小c或其他点不会被转换。你的正则表达式匹配整个组,但我需要分别转换每个点,这就是为什么我需要它们的原因。我还添加了更多路径作为示例。谢谢Jan。你或多或少都是对的,尽管我总是这样e句点,因为它们在视觉上与匹配通配符不同。我不认为我会因为它们不是必需的而停止,特别是因为它们不改变正则表达式