[英]How to fix regex not matching when a character is the first on a new line?
[英]Regex first character not matching
我遇到一些Java模式問題。 這是我的模式:
"^[\\p{L}\\p{Digit}~._-]+$"
它匹配任何US-ASCII字母,數字,一些特殊字符,基本上是任何不會加擾URL的內容。
我想在單詞中找到與該模式不匹配的第一個字母。 基本上,用戶發送文本作為輸入,如果發現非法字符,我必須對其進行驗證並拋出異常。
我嘗試否定此模式,但無法正確編譯。 另外find()
並沒有太大幫助。
合法的輸入將是hello
而?hello
則不是,我的例外應該指出?
是不合適的。
我希望使用Java的Matcher,Pattern或使用util.regex
。 這不是必需的,但是單獨檢查字符串中的每個字符不是解決方案。
編輯:我想出了一個更好的正則表達式來匹配未保留的URI字符
嘗試這個 :
^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$
第一個不匹配的字符是組n°1
我在這里做了一些嘗試: http : //fiddle.re/gkkzm6 1
說明:
我否定了您的模式,所以我建立了這個:
[^\\p{L}\\p{Digit}.'-.'_] [^...] means every character except for
^ ^ the following ones.
| your pattern inside |
模式包括3個部分:
^[\\p{L}\\p{Digit}.'-.'_]*
從第一個字符開始檢查正則表達式,直到遇到不匹配的字符
([^\\p{L}\\p{Digit}.'-.'_])
捕獲組內的不匹配字符(否定)
.*$
字符串末尾之前的任何字符。
希望對您有幫助
編輯:
正確的正則表達式應為:
^[\\p{L}\\p{Digit}~._-]*([^\\p{L}\\p{Digit}~._-]).*$
這是相同的方法,我只更改第一部分和第二部分的內容。
我嘗試了,它似乎有效。
試試這個,找到第一個無效的字符:
Pattern negPattern = Pattern.compile(".*?([^\\p{L}^\\p{Digit}^.^'-.'^_]+).*");
Matcher matcher = negPattern.matcher("hel?lo");
if (matcher.matches())
{
System.out.println("'" + matcher.group(1).charAt(0) + "'");
}
"^[\\\\p{L}\\\\p{Digit}.'-.'_]+$"
模式與在字符類中定義的包含1個以上字符的任何字符串匹配。 注意double '
和.
是可疑的,您可能沒有意識到'-.
創建一個范圍並匹配'()*+,-.
。 如果不是故意的,我認為您打算使用.'_-
。
要檢查字符串是否以字符類中定義的字符以外的其他字符開頭,可以否定字符類,僅檢查字符串中的第一個字符:
if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) {
/* String starts with the disallowed character */
}
我還認為您可以將正則表達式縮短為"(?U)[^\\\\w.'-].*"
。 無論如何, \\\\p{Digit}
都可以替換為\\\\d
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.