用于名称空间Ruby类/模块名称的正则表达式

用于名称空间Ruby类/模块名称的正则表达式,ruby,regex,Ruby,Regex,什么样的正则表达式可以匹配任何名称空间的Ruby类或模块名? 更一般地说,如何匹配由双冒号分隔的单词序列 Word1::Word2 Word1::Word2::Word3 Word1::Word2::Word3::Word4 等等 这是我得到的最接近的东西,但它最多只能用于两个连续的单词: string.scan/[a-zA-Z0-9]+(?:\:::[a-zA-Z0-9]+)/您的方法很好,您应该只量化捕获组或更短的组: \b\w+(?:::\w+)+\b 您的方法很好,您应该只量化捕获组

什么样的正则表达式可以匹配任何名称空间的Ruby类或模块名?
更一般地说,如何匹配由双冒号分隔的单词序列

Word1::Word2
Word1::Word2::Word3
Word1::Word2::Word3::Word4
等等

这是我得到的最接近的东西,但它最多只能用于两个连续的单词:


string.scan/[a-zA-Z0-9]+(?:\:::[a-zA-Z0-9]+)/

您的方法很好,您应该只量化捕获组或更短的组:

\b\w+(?:::\w+)+\b

您的方法很好,您应该只量化捕获组或更短的组:

\b\w+(?:::\w+)+\b

或者,我们可以写以下内容

def valid_mod_name?(str)
  i = str[0,2]=='::' ? 2 : 0
  str[i..-1].split('::').all? { |s| s.match?(/\A\p{Lu}\w*\z/) }
end

valid_mod_name? 'AB::CD::EF'     #=> true
valid_mod_name? 'A'              #=> true
valid_mod_name? '::A::C_d::E3F_' #=> true
valid_mod_name? 'AB::cD::EF'     #=> false
valid_mod_name? 'AB:::CD::EF&'   #=> false
或者,我们可以写以下内容

def valid_mod_name?(str)
  i = str[0,2]=='::' ? 2 : 0
  str[i..-1].split('::').all? { |s| s.match?(/\A\p{Lu}\w*\z/) }
end

valid_mod_name? 'AB::CD::EF'     #=> true
valid_mod_name? 'A'              #=> true
valid_mod_name? '::A::C_d::E3F_' #=> true
valid_mod_name? 'AB::cD::EF'     #=> false
valid_mod_name? 'AB:::CD::EF&'   #=> false


你介意展示一下你的努力吗?当然,不过我没有走得太远。。编辑问题只需重复第二组:
[a-zA-Z0-9]+(?:\:\:::[a-zA-Z0-9]+)+
\b\w+(?::\w+)\b
@revo有效,非常感谢!你是否介意添加它作为答案,以便我可以接受它?COCONUP,在未来考虑等待更长的时间之前,授予绿色的复选标记。这里是我的答案,因为第二个答案(我的)是在你问这个问题几个小时后发布的。然而,一般来说,快速选择会阻碍其他答案,有些人认为对那些仍然在回答问题的人来说是不礼貌的。关键是没有匆忙。许多会员至少要等几个小时,有些要等更长的时间。我的评论是一般性的,不会对选定的答案进行反思。你介意展示你的努力吗?当然,我没有走得太远。。编辑问题只需重复第二组:
[a-zA-Z0-9]+(?:\:\:::[a-zA-Z0-9]+)+
\b\w+(?::\w+)\b
@revo有效,非常感谢!你是否介意添加它作为答案,以便我可以接受它?COCONUP,在未来考虑等待更长的时间之前,授予绿色的复选标记。这里是我的答案,因为第二个答案(我的)是在你问这个问题几个小时后发布的。然而,一般来说,快速选择会阻碍其他答案,有些人认为对那些仍然在回答问题的人来说是不礼貌的。关键是没有匆忙。许多会员至少要等几个小时,有些要等更长的时间。我的评论是一般性的,不会反映所选答案。您应该要求单个类名以大写字母开头,并允许字符串以
:“
开头。另外,考虑到您正在匹配单词字符,是否有必要使用分词符(
\b
)呢?@CarySwoveland通过查看OP自己的正则表达式,我不确定大写字母,也不确定是否以这种方式开始可选的
。但是不,单词边界是不必要的,它们可以安全地删除,因为
\w+
与每个单词字符都非常匹配,但是如果我使用大写字母,那么我就需要它们:
\b[A-Z]\w*(?::\w++)
“A::A”。scan/\b[A-Z]\w*(?::\w+/)=>[“A::A”
,这不是有效的模块名称。(旁白:你需要通过Photoshop运行你的头像。)谢谢你,但你应该问OP为什么他们的要求不准确。对不起,这不是我的案子。如果OP清除,我愿意修改我的解决方案@caryswoveland您应该要求单个类名以大写字母开头,并允许字符串以
::“
开头。另外,考虑到您正在匹配单词字符,是否有必要使用分词符(
\b
)呢?@CarySwoveland通过查看OP自己的正则表达式,我不确定大写字母,也不确定是否以这种方式开始可选的
。但是不,单词边界是不必要的,它们可以安全地删除,因为
\w+
与每个单词字符都非常匹配,但是如果我使用大写字母,那么我就需要它们:
\b[A-Z]\w*(?::\w++)
“A::A”。scan/\b[A-Z]\w*(?::\w+/)=>[“A::A”
,这不是有效的模块名称。(旁白:你需要通过Photoshop运行你的头像。)谢谢你,但你应该问OP为什么他们的要求不准确。对不起,这不是我的案子。如果OP清除,我愿意修改我的解决方案@Caryswoveland为什么
\A
\z
因为OP正在使用
扫描
?我认为你只是在做
(?::)?[A-Z]\w*)+
,而没有考虑适当的边界。@revo,我不知道coconup为什么要使用
扫描
,因为没有意图提取模块名的各个组件,但我们当然不想匹配
“1AB::CD&”
;因此,锚。请注意,对于匹配的第一个组,我只有
(?::)?
(以允许,例如,
::A::B“
);其他组需要
::
。如果未出现
,则只需匹配示例中的大写单词,如
A
。在这方面没有什么不同。两个正则表达式匹配相同的内容。通过
\A
您告诉我们匹配应该发生在开头,并且应该在同一行结束。文件或输入字符串中的模块名不应超过一个。你认为这就是OP所要求的吗?@revo,你倒数第二个评论很有道理。我相应地改变了答案。谢谢至于您最后的评论,是的,我假设问题在于确定给定的字符串是否表示有效的模块名。否则,我们将不得不处理诸如“AB::CD::eF”之类的字符串。是的,它包含一个子字符串,表示有效的模块名(“AB::CD”),但完整的字符串不表示有效的模块名。我们能得出什么结论?既然OP使用的是
扫描
,为什么
\A
\z
?我认为你只是在做
(?::)?[A-Z]\w*)+
,而没有考虑适当的边界。@revo,我不知道coconup为什么要使用
扫描
,因为没有意图提取模块名的各个组件,但我们当然不想匹配
“1AB::CD&”
;因此,锚。注意,对于匹配到的第一个组,我只有
(?:)?