Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Java代码中的正则表达式帮助_Java_Regex - Fatal编程技术网

Java代码中的正则表达式帮助

Java代码中的正则表达式帮助,java,regex,Java,Regex,我需要一个正则表达式来解析字符串,它需要用逗号分隔。。。用作拆分的逗号只能匹配逗号,不能在引号内匹配 should be 3: 3 (is right) should be 3: 14 (is wrong, counted commas inside quotes) should be 24: 12 (is wrong) should be 24: 24. (is right) 对于以下测试用例的结果: String line ="com.day.image;uses:=\"javax.ima

我需要一个正则表达式来解析字符串,它需要用逗号分隔。。。用作拆分的逗号只能匹配逗号,不能在引号内匹配

should be 3: 3 (is right)
should be 3: 14 (is wrong, counted commas inside quotes)
should be 24: 12 (is wrong)
should be 24: 24. (is right)
对于以下测试用例的结果:

String line ="com.day.image;uses:=\"javax.imageio.stream,javax.imageio.spi,javax.imageio.plugins.jpeg,org.slf4j,javax.imageio.metadata,javax.imageio,com.day.imageio.plugins,com.day.image.font\",com.day.imageio.plugins;uses:=\"javax.imageio,javax.imageio.metadata,javax.imageio.stream,javax.imageio.spi,org.w3c.dom\",com.day.image.font;uses:=\"com.day.image\"";

        String[] results1 = line.split("\",");
        String[] results2 = line.split(",");

        System.out.println("should be 3: "+ results1.length);
        System.out.println("should be 3: "+ results2.length);

        line = "com.day.cq.commons,com.day.cq.commons.inherit,com.day.cq.wcm.api,com.day.cq.wcm.api.components,com.day.cq.wcm.api.designer,com.day.cq.wcm.commons,com.day.cq.wcm.tags,com.day.cq.widget,javax.servlet,javax.servlet.http,javax.servlet.jsp;version=\"2.1\",javax.servlet.jsp.el;version=\"2.1\",javax.servlet.jsp.jstl.core,javax.servlet.jsp.jstl.fmt,javax.servlet.jsp.tagext;version=\"2.1\",org.apache.commons.lang;version=\"2.4\",org.apache.sling.api;version=\"2.1\",org.apache.sling.api.request;version=\"2.1\",org.apache.sling.api.resource;version=\"2.1\",org.apache.sling.api.scripting;version=\"2.1\",org.apache.sling.api.servlets;version=\"2.1\",org.apache.sling.scripting.jsp.taglib;version=\"2.0\",org.apache.sling.scripting.jsp.util;version=\"2.0\",org.slf4j;version=\"1.5\"";

        results1 = line.split("\",");
        results2 = line.split(",");

        System.out.println("should be 24: "+ results1.length);
        System.out.println("should be 24: "+ results2.length);
输出是,

should be 3: 3
should be 3: 14
should be 24: 12
should be 24: 24
已更新

我很清楚我需要什么,但我不知道怎么做。。我的解释是我试图完成的不是最好的。一个定义错误的问题,很难找到解决方案。我的一个能力就是简单地处理复杂的场景,显然今晚不适合我

搜索之后,我再次完善了我的问题,谷歌搜索词:“我如何匹配引号之外的字符?”

现在大家都知道谷歌的第一个搜索结果应该是你最有可能寻找的,如果你问的问题太对了谷歌;)

第一个结果

正则表达式应该是:(,)(?=(?:[^“']|[“|”][^“']])

测试和工作

最后,我假设编程技能和理解技能之间存在差异,显然,许多程序员并没有将它们结合在一起。。我问了好几个地方,大多数人都说这是不可能的。。。显然是的

谢谢你的时间,也很抱歉,可能是因为急于寻求帮助

这个网站太棒了!:)

更新2

这个正则表达式(,)(?=(?:[^“']|[“|”][^“]]”美元)。正在给我堆栈溢出的问题

at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
显然,对于某些输入,它可以正常工作,但对于其他输入则不行!还是Java正则表达式引擎有问题

更新3


这个正则表达式不会溢出并起作用(java转义):“(,)(?=(?:[^\“]|\“[^\“]\”)”)”

正则表达式不适合跟踪引号、括号、圆括号等是“内部”还是“外部”;因此,最好的方法可能是逐个字符检查字符串,并使用一个标记跟踪当前字符是否在一组引号内(该标记将以false开头,并在遇到引号时打开或关闭)

但是,如果您确定要对regex执行此操作,我建议您首先用引号(
intermediate=line.split(\);
),然后用逗号拆分中间列表中的每个元素,然后将结果连接在一起。连接步骤会有点棘手,因为您需要将每个数组的最后一个元素与下一个数组的第一个元素组合起来,并用引号将它们分隔开


另一种可能性是:首先用引号分割字符串,然后用字符串中其他地方没有出现的字符序列(如
$split$
)替换奇数段中出现的每一个逗号,但保留偶数段(即表示引用节的部分)单独。将段重新组合为单个字符串(当然,在每对段之间重新插入引号),然后按
$split$

的实例拆分字符串。您期望的结果是什么?想要
行。拆分(\\\”)或类似的?这些是正确的结果。也许你能解释一下你想做什么。我更新了我的问题,你是对的,我道歉了!嗯,这是一个聪明的解决办法。但是,在错误的位置有一个
|
,字符类(
[]
)不应该有条,除非它们实际上是字符类的一部分。看起来您是从链接到的答案上的第一条注释复制和粘贴的,而不是从答案本身复制和粘贴的,但随后的注释指出该表达式有错误。您确定不能用正则表达式执行此操作吗?这是Java中循环字符串的最佳方式,我认为正则表达式有助于提高时间编程的性能。。无论如何,谢谢!据我所知,对于您试图解决的特定问题,与显式构建的解决方案相比,regex通常不会显示性能提升;速度增益主要在编程时间,而不是执行时间。无论如何,我不认为一个单一的正则表达式模式在这里会对你有任何帮助,但我确实在我的答案中添加了一个你可能会觉得更可取的替代解决方案。至于如何循环Java字符串中的字符,我建议使用一个简单的
for
循环
charAt()
…但老实说,我不完全确定如何使用该构造。是的,不幸的是,在Java中没有真正好的方法来扫描字符串。有一天试着在它里面写一个解析器——yuk。而且,正则表达式在很多情况下都是出了名的慢,比如这个例子。