bir Java benzeri dize eşleşen bir tanım stringLiteral orada eşleşecek. Bu regex does not work for long strings (012). Herhangi bir yeniden kullanılabilir uygulama olduğunu bilen var mı, ya da daha fazla alan etkili olan regex bir değişiklik?Regex Java Dize
cevap
İlginç bir problem!
Sadece bu etrafında oynanan ve ile geldi şunlardır:
val r = ("\"" + "(?:[^\"\\p{Cntrl}\\\\]*|(?:\\\\(?:[\\\\'\"bfnrt]|u[a-fA-F0-9]{4}))*)*" + "\"").r
Not: Yukarıdaki regex hem ... ilk sürümden giderilmiştir lider '\' ve sondaki karakterler gerekir Ben sadece orijinal olarak vardı gibi sadece arkasındaki karakterleri tekrarlamak!
Düzenleme: daha verimli düzenli ifade Bulundu. Aşağıdakileri kullanarak, en az varsayılan yapılandırmamda 556'yı ayrıştırabilen orijinalin aksine 950 \\ns
çiftine kadar bir dizeyi ayrıştırabilir.
val r = ("\"" + "(?:[^\"\\p{Cntrl}\\\\]*|\\\\[\\\\'\"bfnrt]|\\\\u[a-fA-F0-9]{4})*" + "\"").r
Düzenleme 2: @schmmd gelen yorum dayanarak, ben daha iyi bir düzenli ifade var. Bu, 2500 \ns
işkence vakasını ayrıştırabilir. Sırr, açgözlü iyelik değiştiricisini kullanmaktır, bu temel olarak geriye dönük bir geri dönüşe ihtiyaç duymaz ve bu da özyinelemeyi kapatır.
val r = (""""([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"""").r
Çözümün özü, bir şeyle eşleştiğiniz her seferde olabildiğince fazla çiğnemek ve çiğnemek.
scala> val r = (""""([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"""").r
r: scala.util.matching.Regex = "([^"\p{Cntrl}\\]*+(?:\\[\\'"bfnrt])*+(?:\\u[a-fA-F0-9]{4})*+)*+"
scala> r.pattern.matcher("\"" + "\\ns" * 2500 + "\"").lookingAt
res4: Boolean = true
scala> r.pattern.matcher("\"" + "s" * 2500 + "\"").lookingAt
res5: Boolean = true
Güncelleme: A pull request scala millet sunuldu. Ve kabul edildi.
- 1. java regex bölünmüş dize
- 2. Java regex çıkarmak metin
- 3. Dize için regex içerir?
- 4. Regex dize ekleme
- 5. regex match ünlem işaretleri java
- 6. Basamak yok Java Regex Pattern
- 7. Java RegEx: Sadece
- 8. Java yerine REGEX
- 9. Regex maç cümle Java
- 10. Youtube tam Java Regex
- 11. Grep regex Dize içeren NOT
- 12. Objc Regex - Grupla dize ayrıştırma
- 13. Python'da regex kullanarak dize ayırma
- 14. Regex bölünmüş dize koruma tırnakları
- 15. Çoklu dize eşleşmesi için regex
- 16. Java regex, rakam, artı, eksi, pound işareti
- 17. Java Regex lookahead çok zaman alır
- 18. Java regex: Yinelenen yakalama grupları
- 19. Yazdır regex java ile eşleşiyor
- 20. Java: büyük dosyalarda regex değişimi
- 21. Java regex: newline + white space
- 22. Java regex String.matches tutarsız çalışıyor
- 23. Bölme boru simgesiyle bir Java dize
- 24. bir dize ilk kelimeyi ayıklamak - regex
- 25. Javascript normal ifadesi - RegEx nesnesine dize
- 26. Bu tür bir dize için regex nedir?
- 27. C# aşağıdaki RegEx çok yavaş büyük dize
- 28. JS regex: tüm basamakları dize ile değiştir
- 29. Regex dize yerine ancak iç html etiketi
- 30. Normal İfadeler (RegEx) - Bir Dize Değişken uzunluğu
Java olsaydı yerleşik bir Thompson NFA'ler kullanılan regex uygulaması ... – schmmd
Kişisel regex iyidir, ama tüm kopukluklar kaldırmak için bana mantıklı. Yine de, "\\ ns" * 2500'ünüzde hala taşıyor. '(" \ "" + "" "([^" \ p {Cntrl} \\] * (?: \\ [\\ '"bfnrt]) * (?: \\ u [a-fA-F0- 9] {4}) *) * "" "+" \ "") r'. – schmmd
Tüm Kleene yıldızlarını cazip Kleene yıldızlarına dönüştürmek daha iyi performans sağlar. ("\" "+" "" ([^ "\ p {Cntrl} \\] * + (?: \\ [\\ '" bfnrt]) * + (?: \\ u [a-fA-F0 -9] {4}) * +) * + "" "+" \ "") r – schmmd