2014-06-30 116 views
0

如何編寫正則表達式以匹配不以空格字符開始或結束的字符串?匹配的字符串可以在中間有任何字符,重要的是,單個字符的字符串應該匹配。第一個字符和最後一個字符的正則表達式條件

我的嘗試是:

/\A\S.*\S\z/ 

但這不會匹配單個字符。

+0

給你要匹配的字符串的一個例子。 – fyz

+0

「a」但不是「a」或「a」 – kempchee

+0

爲什麼不簡單地使用正則表達式呢?第一個和最後一個字符不是「」。在Python中,它將是:'如果s [0]!=''和s [-1]!=''' – sshashank124

回答

3

這是,你不應該試圖建立符合一些正則表達式的情形之一的,而是一個正則表達式匹配作爲的補充,並負面使用正則表達式。

re = /\A\s|\s\z/ 
re !~ " "  # => false 
re !~ ""  # => true 
re !~ "sss" # => true 
re !~ "s ss" # => true 
re !~ " s ss" # => false 
0

使用這個表達式:

\A\S+(?:\s*\S+)*\Z 

您可以用this demo的測試字符串部分打,看看它是如何工作。我假設字符串可以跨越多行,因此\A\Z

在Ruby中,是這樣的:

if subject =~ /\A\S+(?:\s*\S+)*\Z/ 
    match = $& 

說明

  • \A錨稱,我們在主題字符串的開頭
  • \S+匹配一個或多個非空白字符如果你想在開始時允許換行,但只想排除空格字符,可以使用[^ ]+而不是\S+
  • (?:\s*\S+)匹配任意數量的可選空白字符,後跟一個或多個非空格字符
  • *量詞重申,零次或多次
  • \Z錨斷言,我們是目標字符串的結尾
+0

@Downvoter,爲什麼downvote? – zx81

+0

您好,我是一個工作正則與解釋和驅動器downvote! – zx81

-1

使用向前看符號,像這樣:

\A(?=\S).*\S\Z 

Regex101 Demo

匹配字符串的開始和要求(1),所述第一字符是一個非空白字符和(2)的最後一個字符是一個非空白字符。

匹配:

  • a
  • a b
  • a b c d 1231 e

非匹配:

  • (只是有一個空格)
  • a(前導空格)
  • b(尾隨空格)
  • 空字符串
+0

但你的正則表達式不匹配任何東西。 –

+0

@AvinashRaj從技術上講,你是對的;第一個版本測試了字符串是以空白開始還是結束,但匹配本身是零長度的。我在最後加了'。+',現在它也匹配整個字符串。 –

+0

我不是downvoter,但它會更好,如果你的正則表達式是['\ A(?= \ S)。* \ S \ Z'](http://regex101.com/r/cO9yQ2/4) –

1
is_ok = lambda do |str| 
    a, z = str.chars.first, str.chars.last 
    "#{a}#{z}" =~/|\n|\t/ ? false : true 
end 


#"more elegant" (yeah dude I rock) 
is_ok = lambda {|str| [0, -1].map{|i| str.chars[i] }.join =~/|\n|\t/ ? false : true} 
+0

這個答案是唯一一個除了我的答案,給出了期望的結果,但不是那麼優雅。 – sawa

相關問題