2016-02-20 60 views
2

有人可以幫助我如何爲preg_match函數指定特定模式嗎?PHP正則表達式:每個單詞必須以點號結尾

  • 字符串中的每一個字必須以點結尾
  • 字符串的第一個字符必須是[A-ZA-Z]
  • 每個點後可以有一個空間
  • 有不能由兩個空間相鄰
  • 最後一個字符必須(字後logicaly)

例子點:

  • 「Ing」 - > false
  • 「Ing。」 - > true
  • 「.Ing。」 - > false
  • 「Xx Yy」。 - > false
  • 「XX。YY。」 - > true
  • 「XX.YY.」 - > true

請問如何測試字符串?我的模式是

/^(([a-zA-Z]+)(?!) \.)+\.$/ 

我知道這是錯的,但我無法弄清楚它。由於

+1

正則表達式是不好的重複檢查。你唯一能做的就是匹配每個匹配的單詞,然後用代碼計算(普通)單詞並查看正則表達式匹配計數是否等於代碼匹配計數。祝你好運。 –

回答

0

試試這個:

$string = "Ing 
Ing. 
.Ing. 
Xx Yy. 
XX. YY. 
XX.YY."; 

if (preg_match('/^([A-Za-z]{1,}\.[ ]{0,})*/m', $string)) { 
    // Successful match 
} else { 
    // Match attempt failed 
} 

結果:

enter image description here

正則表達式詳細:

^    Assert position at the beginning of a line (at beginning of the string or after a line break character) 
(    Match the regular expression below and capture its match into backreference number 1 
    [A-Za-z]  Match a single character present in the list below 
         A character in the range between 「A」 and 「Z」 
         A character in the range between 「a」 and 「z」 
     {1,}   Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
    \.    Match the character 「.」 literally 
    [ ]    Match the character 「 」 
     {0,}   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
)*    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
2

檢查如何適應您的需求。

/^(?:[A-Z]+\. ?)+$/i 
  • ^比賽開始
  • (?:打開用於重複一個non-capture group
  • [A-Z]+iflag匹配一個或多個阿爾法(低級&上)
  • \. ?字面點接着任選的匹配空間
  • )+這一切的一次或多次,直到$結束

Here's a demo at regex101

如果你想在年底禁止空間,加上負look背後:/^(?:[A-Z]+\. ?)+$(?<!)/i

+0

太棒了!我試圖弄清楚,但也是。我一直在努力'不能有兩個相鄰的空格'因爲我沒有看到它的重複模式。還有一件小事,你應該說'i'國旗使正則表達式不區分大小寫。 +1爲您的答案!那很棒! –

+0

@JorgeCampos歡迎,是的我提到我國旗,它匹配一個或多個阿爾法,我的意思是低和高:D更新。 –

+0

如果標點符號或數字也可以出現在字符串中,該怎麼辦? –

相關問題