正则表达式,其中模式重复Ruby On rails

时间:2014-11-05 21:59:52

标签: ruby-on-rails ruby

我有以下正则表达式

/^[a-zA-z]+\s{0,1}$/

我使用这个正则表达式来验证类似" hello"

的字符串

但是如果一次又一次地重复相同的格式会怎样?

示例    "你好你好吗"

我不想写它

  /^[a-zA-z]+\s{0,1}[a-zA-z]\s{0,1}[a-zA-z]\s{0,1}[a-zA-z]\s{0,1}$/

太长了 救救我!

4 个答案:

答案 0 :(得分:1)

pattern = "[a-zA-z]+\s{0,1}"
expression = /^#{pattern}#{pattern}#{pattern}#{pattern}$/

但是,更好的方法是使用更好的正则表达式,或者定义正则表达式以允许特定模式被包含多次。

例如

/^([a-zA-z]+\s{0,1}){4}$/

此外,如果您使用某些better classes and matchers,我猜您可能会降低表达式的复杂性。

/^[a-zA-z]+\s{0,1}$/

相当于

/^[[:alpha]]+\s?$/

因此

/^([[:alpha]]+\s?){4}$/

匹配无限数量的单词(从N到无限制)

/^([[:alpha]]+\s?){N,}$/

或使用+匹配一个或多个。

/^([[:alpha]]+\s?)+$/

答案 1 :(得分:1)

如果您所追求的只是一串由0或1空格分隔的字母,那么您的模式可以彻底简化:

/([a-z]+\s?)+/i

所以,从里到外工作,

  • [a-z]匹配a-z
  • 范围内的字符
  • +是一个匹配“1次或更多次”的量词,因此[a-z]+匹配“1个或更多字母”
  • \s? - ?是一个量词,意思是“0或1”,与{0,1}相同,所以“0或1空格”
  • ([a-z]+\s?)分组表达式和......
  • +是一个匹配“1次或更多次”的量词。
  • /i使整个事件不区分大小写,因此不需要[A-Za-z]。只需[a-z]

当然,你需要锚定整个事物:

/^([a-z]+\s?)+$/i

答案 2 :(得分:1)

@SimoneCarletti建议使用/^([:alpha]+\s?)+$/,它正在使用捕获组([:alpha]+\s?)。在长字符串上,这不如非捕获组有效:

 (?:[[:alpha:]]+\s?)

差异发生在内心深处,第一个必须记住每个匹配的位置,消耗空间和时间。非捕获只是记得发现它们更快。

require 'fruity'

text = 'Lorem ipsum dolor sit amet consectetur adipisicing elit Amet platonem fastidii fieri historiae populo mutans fortasse misisti quoddam recta contentus odia bona confidere magis negant caecilii theophrastus necessariam lucilius acuti nobis viris puerilis deorsum aliquid Atilii industriae sitne ipsi improborum levis mel affectus scientiam disciplinam disciplinam repellat Odioque suam graeca intereant potiora Iracundiae docui triarium triari neque assentiar maiorem ornateque futuros fruentem orestem forensibus teneam sciscat postremo animus fortibus videntur e video probant eas delectet molestia docere dictum Unde existimo tota labefactant Forensibus deterret autem putat remissius tollatur credo allicit duo accuratius magnus finxerat effecerit facillime Pertineant concederetur placet habendus'

compare do
  regex1 { text[/^([[:alpha:]]+\s?)+$/] }
  regex2 { text[/^(?:[[:alpha:]]+\s?)+$/] }
end
# >> Running each test 128 times. Test will take about 1 second.
# >> regex2 is faster than regex1 by 19.999999999999996% ± 10.0%

此外,“alpha”字符类的“POSIX括号表达式”应为[[:alpha:]]

答案 3 :(得分:0)

如果您想重复匹配的模式,可以将其包装在括号中(将它们组合在一起),然后使用repetition meta-character设置您重复的重复次数等。

在这种情况下,如果您希望匹配一次或多次找到特定字符串,则可以使用以下内容:

/^([a-zA-z]+\s{0,1})+$/

在这里,我们使用+重复元字符,这意味着"这必须匹配一次或多次。"

顺便说一下,您使用{0,1}来匹配空格0或1次,可以替换为?,,这也意味着"匹配此0或1倍"

所以,这可能变成:

/^([a-zA-z]+\s?)+$/

您还可以在正则表达式的末尾添加ignore case optioni)来执行不区分大小写的匹配,如下所示:

/^([a-z]+\s?)+$/i

希望这有帮助。