我需要在Java中使用正则表达式验证以下字符串:
String alphanumericList ="[\"State\"; \"districtOne\";\"districtTwo\"]";
我尝试了以下内容:
String pattern="^\\[ (\"[\\w]\")\\s+(?:\\s+;\\s+ (\"[\\w]\")+) \\]$";
String alphanumericList ="[\"State1\"; \"district1\";\"district2\"]";
但验证失败了。 任何帮助表示赞赏。
答案 0 :(得分:2)
我会尝试用你的表达标记可能存在的问题(在字符上方发出数字):
1 4 2 3 1 4 5 1
"^\\[ (\"[\\w]\")\\s+(?:\\s+;\\s+ (\"[\\w]\")+) \\]$"
如您所见,至少有5个问题:
\\s+
)之后至少有一个空格字符,输入似乎不包含该字符。您可能希望将其删除或将量词从+
更改为*
。(\"[\\w]\")+
表示"双引号,单字符,双引号"并且至少一次。除此之外,\w
已经是一个字符类,你在这里不需要括号(除非你想在里面添加更多的类或字符)。您可能需要(\"\\w+\")
代替。(?:\\s+;\\s+ (\"[\\w]\")+)
)的非捕获组没有量词,即预期恰好一次。您可能希望将量词+
或*
放在该组之后。另一个不直接问题的问题是\"[\\w]\"
周围的捕获组。由于您似乎希望在分号后匹配多个字符串,因此您只能捕获其中一个匹配的组。因此,你很可能无法做到你想要的事情,因此这个小组是没有必要的。
那说固定的原始表达式看起来像这样:
pattern = "^\\[(\"\\w+\")(?:\\s*;\\s+\"\\w+\")+\\]$"
答案 1 :(得分:0)
您正在寻找这种模式:
String pattern = "\\[\\s*\"[^\"]*\"\\s*(?:;\\s*\"[^\"]*\"\\s*)*+\\]";
无需添加锚点,因为如果使用matches()
方法则存在隐含,因为此方法更适合验证任务。
模式细节:
\\[ # a literal opening square bracket
\\s* # optional whitespaces
\" # literal quote
[^\"]* # content between quotes: chars that are not a quote (zero or more)
\"
\\s*
(?: # non-capturing group:
; # a literal semi-colon
\\s*
\" # quoted content
[^\"]*
\"
\\s*
)*+ # repeat this group zero or more time (with a possessive quantifier)
\\] # a literal closing square bracket
如果没有关闭的方括号,占有量词会阻止正则表达式引擎回溯到重复的非捕获组。这是一种安全措施,可以防止不必要的回溯并使模式更快地失败。并非由于同样的原因你也可以在非捕获组之前制造其他量词。 More about possessive quantifiers.
我决定以这种方式描述引号之间的内容:\"[^\"]*\"
,但您可以更具限制性,仅允许使用单词字符:\"\\w*\"
或更一般,允许转义引号:{{ 1}}
答案 2 :(得分:0)
试试这个
static final String HEAD = "^\\[\\s*";
static final String TAIL = "\\s*\\]$";
static final String SEP = "\\s*;\\s*";
static final String ITEM = "\"[^\"]*\"";
static final String PAT = HEAD + ITEM + "(" + SEP + ITEM + ")*" + TAIL;
答案 3 :(得分:-1)
尝试:
pattern = "^\\[(\"\\w+\";\\s*)*(\"\\w+\")\\]$";