-1

我有一个 XML 样式的字符串,我试图让一个组退出while(matcher.find()){}循环。这是我正在使用的正则表达式:

<myset setName="(.+?)">(.*?)</myset>

当转换为在 java 中使用时:

Pattern setPattern = Pattern.compile("<myset setName=\"(.+?)\">(.*?)</myset>");
Matcher matcher = setPattern.matcher(targetString);
while(matcher.find()){
    Log.i(TAG, "First group: " + $1 + "  Second group: " + $2);
}

$1是 setName -- 这应该总是至少 1 个字符。

$2是开始标签和结束标签之间的所有内容(或什么都没有)。这可以是 0 个或多个字符。

如果我find()对字符串执行 a : <myset setName="test"><lots of stuff in this subtag /></myset>

它完美地工作,$1被分配test$2分配<lots of stuff in this subtag />

但是,如果我find()对此字符串执行 a : <myset setName="test"><lots of stuff in this subtag /></myset><myset setName="test2"><more stuff in this subtag /></myset>

然后$1匹配test$2匹配<lots of stuff in this subtag /></myset><myset setName="test2"><more stuff in here />

预期的行为是第一个find()应该有$1matchtest$2match <lots of stuff in this subtag />。然后第二个find()应该有$1matchtest2$2match <more stuff in this subtag />

我确信我忽略了一些明显的东西。谢谢!

4

2 回答 2

0

为了这:

然后$1匹配test并且$2匹配<lots of things in this subtag /></myset><myset setName="test2"><more stuff in here />

听起来您正在使用以下表达式:<myset setName="(.+?)">(.*)<\/myset>

示例:http ://www.rubular.com/r/516CWASjAF

您的表达式<myset setName="(.+?)">(.*?)<\/myset>适用于您的示例字符串,但我建议您将表达式更改为以下,以便如果引用的文本为空,那么至少引擎不会离开字符串的该区域:

<myset setName="([^"]*)">(.*?)<\/myset>

于 2013-06-27T19:11:36.150 回答
0

事实证明,正如你们中的许多人所指出的那样,我的问题不在于我的语法或代码,而在于我在 Eclipse 中使用的 Regex Util 插件。谢谢大家的帮助。我将学会信任我的代码并对其进行测试,即使我的工具并不总是表明它应该可以工作!

于 2013-07-01T03:42:39.523 回答