检查XML标记中的字符串长度 - 正则表达式

时间:2017-10-17 09:13:20

标签: java regex xml

我想使用正则表达式检查XML标记之间的字符串长度。字符串的值总是6,我想检查是6。 我试过这样做:

<tag>(.+?){6,6}</tag>

但即使我改变数字也总是如此。 (?=^.{6}$)这个正则表达式也不起作用,我得到一个正则表达式不包含的错误。 如何检查标签之间的字符串长度?

我没有这样验证xml,我只想检查断言。

2 个答案:

答案 0 :(得分:1)

警告:您不应该以这种方式验证XML!正确的做法可能会成为一项非常复杂的任务。

相反,使用XML解析器,获取&#34;标记&#34;的文本值。元素,并检查其长度。

但如果您仍然希望这样做,以下正则表达式将按照您的描述进行(但可能不是您想要的!):

<tag>.{6}</tag>

为什么不做你想做的事?

  1. 因为这也会接受以下不需要的值:

    <tag><foo/></tag>

  2. 它不会接受以下完全有效的值:

    <tag>foo&amp;ba</tag>

    (即&#34;标签&#34;包含6个字符的文字&#34; foo&amp; ba&#34;。)

  3. 但它会接受以下不需要的值:

    <tag>2&gt;1</tag>

    (即&#34;标记&#34;包含3个字符的文字&#34; 2&gt; 1&#34;。)

  4. 编写一个解决所有这些问题的正则表达式非常复杂且容易出错。如上所述,改为使用真正的XML解析器。

    但是,如果您可以使用过于严格的正则表达式(即安全地拒绝所有无效值,但也拒绝某些有效值),并且您确定您的XML文件将是UTF-8编码的,那么你可以使用:

    <tag>[^&<]{6}</tag>
    

    即6个字符,其中没有&<

    (您也可以将>排除在&#34;确定&#34;,但这里实际上并不需要,因为>是XML字符串中完全有效的字符因为它不是标记的一部分,即你控制所有开放的<字符,在这种情况下你会这样做。)

    如果您知道确切的允许字符集,事情就更简单了,您也可以使用它。例如,如果允许使用6个大写字母,则可以使用:

    <tag>[A-Z]{6}</tag>
    

    请注意,此正则表达式仍然过于严格,因为它不允许例如以下完全有效的输入:

    <tag  >[A-Z]{6}</tag>
    

答案 1 :(得分:-2)

简单而漫长的方法是从> +1和&lt;中获取子字符串。但是如果标签错误就像texttag&gt;那么它会抛出一个StringIndexOutOfBoundsException,如果是,那么它将是tagtext!

首先将该行作为字符串读取,然后将其转换为字符数组,然后迭代该行! 如果计数&lt; &安培; &GT;每个是2,然后从'&gt;获取子串&LT;”

List<String> list= new ArrayList<String>();
FileReader fr= new FileReader(path);

BufferedReader br= new BufferedReader(fr);

String str= null;

while((str=br.readLine())!=null)){ 
    list.add(str);
    }

//suppose you want to check 3rd line
int lbrack=0; rbrack=0;
String text= null;
String data= list.get(2);
char[] brack= data.toCharArray();
for(int i=0; i<brack.length;i++){
    if(brack[i]=='<')
    lbrack++;
    if(brack[i]=='>')
    rbrack++;
    }
if(lbrack==2 && rbrack==2){
      text= data.substr(data.indexOf(">")+1,data.indexOf("<"));
    }
else {
    System.out.println("this is root tag or some problem here");
}