Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java6匹配器类_Java_Matcher - Fatal编程技术网

Java6匹配器类

Java6匹配器类,java,matcher,Java,Matcher,我有一个字符串,如下所示: TEST|A||B|C|**""**|D|""|||||\r\n TEST|Z||V|P|**""**|Y||||||||\r\n TEST|A||B|C||D||||||\r\n TEST|Z||V|P||Y||||||||\r\n String regexPattern = "TEST.*\\|([|\\|]*)(\"\")([|\\|]*)\\|";

我有一个字符串,如下所示:

TEST|A||B|C|**""**|D|""|||||\r\n
TEST|Z||V|P|**""**|Y||||||||\r\n
TEST|A||B|C||D||||||\r\n
TEST|Z||V|P||Y||||||||\r\n
String regexPattern = "TEST.*\\|([|\\|]*)(\"\")([|\\|]*)\\|";
         
如果内容为“”,我需要将第5到第6次出现的内容设置为空白。 所以期望的输出是

TEST|A||B|C||D|""|||||\r\n
TEST|Z||V|P||Y||||||||\r\n
因此,我使用matcher/pattern和matcher.replaceFirst()使用这个正则表达式模式:

String regexPattern = "TEST.*\\|([|\\|]*)\\|([|\\|]*)\\|([|\\|]*)\\|([|\\|]*)\\|\"\"\\|([|\\|]*)"
虽然我只希望第5次和第6次出现的|中的“”变为空,但program正在将遇到的所有“”替换为空

因此,输出如下所示:

TEST|A||B|C|**""**|D|""|||||\r\n
TEST|Z||V|P|**""**|Y||||||||\r\n
TEST|A||B|C||D||||||\r\n
TEST|Z||V|P||Y||||||||\r\n
String regexPattern = "TEST.*\\|([|\\|]*)(\"\")([|\\|]*)\\|";
         
我不确定是否需要更改我拥有的正则表达式模式?或者有没有一种方法可以告诉matcher类,一旦它更改了匹配模式中的第一个“不要更改其他”,而是在测试片段的其他出现处更改它,如果有,如何更改

更新: 明白了。非常抱歉造成了巨大的混乱。我会尽我最大的努力使它尽可能精确/清晰

问题改为:

我想使用一个模式来使用java模式和matcher类在字符串中搜索

字符串有两行,数据用|分隔,每行用\r\n分隔\

简化示例如下:

TEST|A||B|C|**""**|D|""|||||\r\n
TEST|Z||V|P|**""**|Y||||||||\r\n
TEST|A||B|C||D||||||\r\n
TEST|Z||V|P||Y||||||||\r\n
String regexPattern = "TEST.*\\|([|\\|]*)(\"\")([|\\|]*)\\|";
         
测试字符串内容:

TEST|JUNK1|JUNK2|JUNK3|JUNK4|""|JUNK6|""|JUNK8
TEST|JUNK11|JUNK12|JUNK13|JUNK14|""|JUNK16|
在上面的示例中,我希望将JUNK4 |之后的“”(第5到第6行中出现的|之间的内容)设置为空/空白。 我不希望该行其他位置的“”发生变化。同样的事情需要在下一行发生

因此,我将以下正则表达式模式与Java Matcher结合使用,模式类如下:

TEST|A||B|C|**""**|D|""|||||\r\n
TEST|Z||V|P|**""**|Y||||||||\r\n
TEST|A||B|C||D||||||\r\n
TEST|Z||V|P||Y||||||||\r\n
String regexPattern = "TEST.*\\|([|\\|]*)(\"\")([|\\|]*)\\|";
         
但它正在替换每一行中出现的所有“”,这不符合我的要求

我尝试了quantifier/POSIX{1},但徒劳地认为它会限制对TestStr中第一个“”的搜索,但徒劳

使用{1}的正则表达式:

String regexPattern = "TEST.*\\|([|\\|]*)(\"\"){1}([|\\|]*)\\|";

因此,如何在模式中进行限制以获取字符串片段,直到第一个“。

一个不使用复杂正则表达式的简单答案:

String temp[] = inputString.split("\\|");
if ("\"\"".equals(temp[5]))
{
    temp[5] = "";
    StringBuilder buf = new StringBuilder();
    for (String s : temp)
        buf.append("|").append(s);
    inputString = buf.substring(1);
}

同时,注意别人对你说的话。使用编辑工具,不要将更正作为答案。

这是关于这些regexp怪物的第五个问题。将此视为你使用错误方法的迹象,并重新思考你在做什么。为你的格式编写一个解析器,或者在这里解释你的问题并征求意见,但请停止。这并不是说正则表达式是错误的方法,而是你不断地提出新的问题,一个和另一个一样不精确,与所述规范不匹配的简化示例相互矛盾,并且随着问题的不断变化。另外,你显然不太关心这个问题,以至于无法回答潜在的回答者要求你澄清的问题。没有人关心你的截止日期,但我们想要一个可以回答的问题,而你的不是。