半结肠分离的字母数字

时间:2015-07-08 09:36:55

标签: java regex

我需要在Java中使用正则表达式验证以下字符串:

String alphanumericList ="[\"State\"; \"districtOne\";\"districtTwo\"]";

我尝试了以下内容:

String pattern="^\\[ (\"[\\w]\")\\s+(?:\\s+;\\s+ (\"[\\w]\")+) \\]$";
String alphanumericList ="[\"State1\"; \"district1\";\"district2\"]";

但验证失败了。 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

我会尝试用你的表达标记可能存在的问题(在字符上方发出数字):

     1  4        2      3        1  4        5 1
"^\\[ (\"[\\w]\")\\s+(?:\\s+;\\s+ (\"[\\w]\")+) \\]$"         

如您所见,至少有5个问题:

  1. 表达式中的空格按字面解释,即如果输入不包含它们,则它将不匹配。很可能你想删除那些空格。
  2. 您希望在第一个组(\\s+)之后至少有一个空格字符,输入似乎不包含该字符。您可能希望将其删除或将量词从+更改为*
  3. 您希望每个分号前至少有一个空白字符。再加上没有。 2这将在第一组之后至少生成两个。解决方案与否相同。 2。
  4. 你的表达式双引号之间的字符串似乎是错误的。 (\"[\\w]\")+表示"双引号,字符,双引号"并且至少一次。除此之外,\w已经是一个字符类,你在这里不需要括号(除非你想在里面添加更多的类或字符)。您可能需要(\"\\w+\")代替。
  5. 此外,包含分号
    (?:\\s+;\\s+ (\"[\\w]\")+))的非捕获组没有量词,即预期恰好一次。您可能希望将量词+*放在该组之后。
  6. 另一个不直接问题的问题是\"[\\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+\")\\]$";