2015-12-21 48 views
0

我想限制某些字符,特別是.只能在我的正則表達式匹配的中間。也就是說,我想匹配Node.js,但不匹配end..css允許某些字符只在中間,末尾或開始的單詞而不強制某些長度

我現在的正則表達式有它需要至少兩封信給正常工作的問題:

[\w]+[\w\.']*[\w']+ 

你也可以看到,我想允許'中間和結束時,如I'mstudents' (論文或其他屬性)。

這個問題是,單個字母的單詞不匹配,例如。 I。如何解決這個問題?這裏有一個測試用例:https://regex101.com/r/hV9fQ5/1

+0

我真的不得到你正在嘗試做的,你可以更具體 是,這是你在找什麼:' [\ w \''] * [\ w'] +' –

+0

_這個問題是單個字母單詞不匹配。很明顯,因爲您有兩個非空量詞('[\ w ] +')。你必須使用非捕獲組。 – hindmost

+0

如果我正確理解你想要做什麼,另一種解決方案是匹配所有'\ S +'組,然後過濾出與'^ \ W'或'[^'\ w] $'匹配的組。 – ETHproductions

回答

1

這一個似乎正確地匹配所有的測試用例:

(?:^|\s)(?:[\w]+[\w\.']*[\w']+|\w)?(?=\s|$) 

它首先匹配的行開始或空格字符,那麼無論你目前的正則表達式或單一\w,最後斷言下一個字符是一個空白字符,或者匹配在一行的結尾。這可能不是最好的答案;它保持領先的空間以及其餘部分,但是這可以被修剪掉。這裏有一個測試你的例子:https://regex101.com/r/vL7dV4/1

+0

這與「I」不匹配。 – 2015-12-21 17:11:10

+0

@torazaburo謝謝,修正。 – ETHproductions

0

你可以嘗試完成你想要的東西,把你的需求分成幾個部分並照顧他們每個人。

要它以'或一個字母開頭? [']*[\w]
可能有 多個.在中間? [\.w]*
可能以'或 字母結尾? [\w]*[']*

所以你最終獲得:[']*[\w]+[\.w]*[\w]*[']*

看到它在行動here

+1

這匹配''結束。「'。 – 2015-12-21 17:10:31

0

在英語中,你想要的是「(1)的單個字母,隨後(2)無論是( 2a)零個或多個字母的序列,或(2b)一系列字母,句號或撇號後跟一個字母或撇號「。

這直接轉化爲

/^(\w(\w*|[\w.']+[\w']))$/ 
    ^^     (1) 
    ^^^^^^^^^^^^^^^^^^^ (2) 
     ^^^    (2a) 
      ^^^^^^^^^^^^^ (2b) 

以此爲:

input . split(" ") . filter(function(word) { 
    return word.match(/regex/g); 
}); 
+0

這真的很好,但它有一個問題:它只適用於單個單詞測試。 – ETHproductions

0

我知道你在尋找的是:

\w+(?:['.]\w+)*'? 

demo

的這種結構的主要優點是連續的點和單引號是不允許的。

(如果你想允許在開始報價,加上'?

+1

不錯,但是這在'.test'和'test.'中錯誤地匹配'test'。 – ETHproductions

+0

@ETHproductions:我認爲你誤解了需求*(這有點不清楚)*。 –

+0

我想你已經誤解了需求(說'_not'end.'或'.css'_)。 – Armali