【问题标题】:Check String length in XML tags - regex检查 XML 标记中的字符串长度 - 正则表达式
【发布时间】:2017-10-17 09:13:19
【问题描述】:

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

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

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

我不以这种方式验证 xml,我只想检查断言。

【问题讨论】:

  • 你量化了一个量化的子模式。使用&lt;tag&gt;.{6}&lt;/tag&gt;&lt;tag&gt;[^&lt;]{6}&lt;/tag&gt;

标签: java regex xml


【解决方案1】:

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

相反,使用 XML 解析器,获取“tag”元素的文本值,并检查其长度。

但如果你仍然想这样做,下面的正则表达式会做你描述的事情(但可能不是你想要的!):

<tag>.{6}</tag>

为什么不按你的意愿去做?

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

    &lt;tag&gt;&lt;foo/&gt;&lt;/tag&gt;

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

    &lt;tag&gt;foo&amp;amp;ba&lt;/tag&gt;

    (即“tag”包含6个字符的文本“foo&ba”。)

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

    &lt;tag&gt;2&amp;gt;1&lt;/tag&gt;

    (即“tag”包含3个字符的文本“2>1”。)

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

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

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

也就是说,6个字符都不是&amp;&lt;

(您也可以排除 &gt; 只是为了“确定”,但这里实际上不需要,因为 &gt; 是 XML 字符串中完全有效的字符,只要它不是标签的一部分,即您控制所有打开的 &lt; 字符,在这种情况下您可以这样做。)

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

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

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

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

【讨论】:

  • 我不验证,我想通过这种方式检查断言。
  • 您应该已将其添加到您的问题中。它极大地改变了整个情况。
【解决方案2】:

简单而冗长的方法是从 >+1 和 ,那么它会抛出一个 StringIndexOutOfBoundsException 或者如果它是,那么它将是 tagtext!

先将行读取为字符串,然后将其转换为字符数组,然后对行进行迭代! 如果 的个数各为 2,则取 from '>

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");
}

【讨论】:

  • 被要求使用正则表达式的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2015-04-02
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多