2013-06-27 42 views
17

我正在開發自己的JavaScript庫以支持正則表達式的新元字符和功能,並且我想找到[^xy]不等於(?!x).(或更具體地說(?:(?!x|y).))的情況。是否存在「[^ xy]」不等於「(?!x | y)」的情況?

就拿示例文本:"abc\n"

說我要模仿一個Perl的正則表達式:/\A.{3}\Z/s

隨着單行標誌,JavaScript的正則表達式應該等於:/^[\s\S]{3}\n*$(?!\s)/\A變得^.成爲[\s\S]\Z變成\n*$(?!\s)

現在,/^.{3}$/會失敗,但/^[\s\S]{3}\n*$(?!\s)/會c apture「abcabc」(與Perl正則表達式相同)

由於\Z不僅包含元字符,而且模擬[^\Z]似乎更難。

就拿示例文本:"abcabc\n"

所提出的JavaScript正則表達式Perl的正則表達式/.{3}[^\Za]/g.{3}(?:(?!\n*$(?!\s)|a).)/g

雙方將匹配"bcab"

所以,最後,我再次提出這個問題。有沒有這種情況下,[^xy]不等於(?:(?!x|y).)這種情況下,也許在一個更復雜的正則表達式中,一個預見會改變場景?

+0

'/^[\ s \ S] {3} \ n * $(?!\ s)/。exec(「abcabc \ n」)'不符合我的要求,並且不會爲您提供'abcabc'建議 – Eric

+0

也不是perl正則表達式'/ \ A。 {3} \ Z/s'匹配'「abcabc \ n」',正如您聲稱的那樣... – Eric

+0

正確。我改變了一些東西,忘了編輯它們。第一個場景使用文本「abc \ n」,第二個場景使用文本「abcabc \ n」。我已經對主帖進行了編輯。 –

回答

5

有沒有[^xy]不等於(?!x|y).的情況?

只有你已經描述過的那個:JS點不符合換行符,需要用[\s\S]代替。

\Z成爲\n$(?!\s)

這看起來是錯誤的。在字符串結尾(\z/$)之後,不管是否有空格,都不會有任何內容。據我所知,\Z是零寬度斷言(它不消耗換行符(S))和應該等於

(?=\n*$) 
// ^not sure whether ? or * 

由於\Z包含的不僅僅是一個元字符較多,模仿[^\Z]似乎比較難。

你是什麼意思的「元字符」?這是一個零寬度的斷言,在角色類中沒有多少意義。我猜這是一個語法錯誤,或者將被解釋爲字面(未轉義)爲[^Z]

+0

錯字:\ Z變成\ n * $(!!\ s)。在Perl中,\ Z等同於\ n * \ z。 \ z僅在字符串的末尾才爲真。因此,如果\ z是$(!!\ s),那麼\ Z是\ n * $(?!\ s)。看起來我已經開始用這整個「轉換」的想法過度考慮事情。你完全正確[^ Z]變成[^ Z]。我想我需要休息一下編程,謝謝你的洞察力。 :) –

+1

@JoeySchooley問題在於'\ n'不包含在比賽中。所以'\ n'也屬於前瞻(我對'\ n'後面的星不太確定) –

+0

我在上面的評論中做了一個編輯,但是看起來你打敗了我。感謝您研究我的推理的實際問題。 –

4

[^xy]將匹配\n(?!x|y).將默認不匹配\n(因爲.不匹配\n

我不相信JavaScript有一個「DOTALL」或「單線」修飾,但每一個瀏覽器的新版本擊中每隔幾個月,我失去了蹤跡。

9

對於輸入字符串"x\na",2個正則表達式給出不同的輸出,因爲.與換行符不匹配。

console.log("x\na".match(/(?:(?!x|y).)/)) 
["a", index: 2, input: "x↵a"] 
console.log("x\na".match(/[^xy]/)) 
["↵", index: 1, input: "x↵a"] 

如果更改.[\s\S],該輸出在這種情況下相同的:

console.log("x\na".match(/(?:(?!x|y)[\s\S])/)) 
["↵", index: 1, input: "x↵a"] 

我想不出任何其他情況現在。

0

正如其他人所說的,您應該使用[\s\S]而不是.進行替換。否則,如果只是通過字符串進行轉換,還有一些事情需要處理。特別是,元字符和轉義序列:

[^*)] => (?!\*|\))[\s\S] 

但我想你需要照顧解析和寫元字符反正。

雖然最棘手的一個可能是\b,因爲它是字符類中的字符(退格)和外部的字邊界。因此,在替換中,您必須使用八進制或十六進制轉義:

[^a\b] => (?!a|\10)[\s\S] 
    or => (?!a|\x08)[\s\S] 

除此之外,兩者應該始終等效。

0

其中格式[^xy]是不一樣的(?:(?!x|y).)將是其中x是一個零寬度斷言而不是像一個實際的字符的情況:

鑑於這種示例文本:ab-yz

正則表達式:[^\by]實施例:http://www.rubular.com/r/ERKrqyeAs9

返回:

[0] => a 
[1] => b 
[2] => - 
[3] => z 

正則表達式:(?:(?!\b|y).)例如:http://www.rubular.com/r/V5RdyQEQo5

返回:

[0] => b 
[1] => z 

其他非等價的表達,這在很大程度上集中於同一語法有內部或字符類之外的不同meenings的事實:

  • [^^y]收益率a,b, - ,z不等於(?:(?!^|y).)收益率b, - ,z
  • [^.y]產生A,B, - ,Z不等於(?:(?!.|y).)產生什麼

或者你可以在Perl試試這個以Unicode金塊:http://ideone.com/2xMfkQ

print "\ncapture\n"; 
@m = ("ss" =~ m/^(?:(?!\xDF|y).)+$/ui); 
print for @m; 

print "\nclass\n"; 
@m = ("ss" =~ m/^[^\xDFy]+$/ui) ; 
print for @m; 

產量:

capture 

class 
1 
+0

字符類中的字邊界對你來說意味着什麼? – Bergi

+0

這對我來說並不意味着什麼,但是喬伊的問題是「我想找一個[^ xy]不等價的情況(?:(?!x | y)。))。'這是一個語法正確的表達,產生明顯不同的結果。 –

+0

那麼'[^ \ by]'對我來說在語法上是不正確的。在結果中,你會得到它被解釋爲'[^ by]',其* *相當於'(?!b | y)。「 – Bergi

相關問題