簡體   English   中英

正則表達式第一個字符不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM