2014-11-05 51 views
0

我有以下的正則表達式其中模式重複Ruby的正則表達式軌

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

我用這個正則表達式驗證一個字符串,如「你好」

但是這是怎麼回事,如果同樣的格式一再重複

例如 「你好!你」

我不想把它寫

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

太長了 幫幫我!

+1

你想驗證什麼部分:它以空白結尾?或者每個單詞之間只有一個空格? – GSP 2014-11-05 22:09:12

+1

僅供參考:「{0,1}」與「?」相同。只需使用'\ s?',而不是'\ s {0,1}'。 – meagar 2014-11-05 22:10:42

回答

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

但是,更好的方法是使用更好的正則表達式,或者定義regexp以允許多次包含該特定模式。

例如

/^([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?)+$/ 
+0

Simone這是我需要的。非常感謝 – user3678471 2014-11-05 22:16:08

+0

'+'比'{1,}'更好' – meagar 2014-11-05 22:20:13

+0

我同意,更新了答案。 – 2014-11-05 22:21:59

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 
+0

非常感謝meagar – user3678471 2014-11-05 22:18:10

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 

希望這有助於。

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% 

另外,「POSIX括號表達式」爲「阿爾法」字符類應該是[[:alpha:]]