Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,我有一个下面的字符串,它来自excel列 "\"USE CODE \"\"Gef, sdf\"\" FROM 1/7/07\"" 我想设置regex模式来检索整个字符串,这样我的结果就会与 "USE CODE ""Gef, sdf"" FROM 1/7/07" 下面是我试过的 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public sta

我有一个下面的字符串,它来自excel列

  "\"USE CODE \"\"Gef, sdf\"\" FROM 1/7/07\""
我想设置regex模式来检索整个字符串,这样我的结果就会与

"USE CODE ""Gef, sdf"" FROM 1/7/07"
下面是我试过的

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // String to be scanned to find the pattern.
      String line = "\"USE CODE \"\"Gef, sdf\"\" FROM 1/7/07\", Delete , Hello , How are you ? , ";
      String line2 = "Test asda ds asd, tesat2 . test3";

      String dpattern = "(\"[^\"]*\")(?:,(\"[^\"]*\"))*,|([^,]+),";
      // Create a Pattern object
      Pattern d = Pattern.compile(dpattern);
      Matcher md = d.matcher(line2);

      Pattern r = Pattern.compile(dpattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: 0 " + m.group(0) );
       //  System.out.println("Found value: 1 " + m.group(1) );
         //System.out.println("Found value: 2 " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}
它的结果在(逗号)之后中断,因此输出是

Found value: 0 "USE CODE ""Gef,
应该是

Found value: 0 "USE CODE ""Gef sdf"" FROM 1/7/07",
对于第二行
Matcher m=r.Matcher(第2行)输出应为

Found value: 0 "Test asda ds asd",
你可以用

(?:"[^"]*(?:""[^"]*)*"|[^,])+

说明

  • -领先报价
  • [^”]*
    -0+字符(双引号除外)
  • (?:“[^”]*)*
    -0+序列的
    文本后跟0+字符,而不是双引号
  • -尾随引号
或:

  • [^,]
    -除逗号外的任何字符
当整个模式包含
(?:…)+
时,会匹配1次或多次,并且
+
匹配1次或多次出现

:


注意:在实际场景中,我不能像删除引号然后应用正则表达式那样对给定字符串进行操作。我所能做的就是通过正则表达式模式获得它。因此,这个java是为了测试正则表达式模式。我不确定您试图对非捕获组
?:
和OR运算符
|
,但是看起来您可以使用
(\“[^\”]*\”{3}
并且它将匹配3个带引号的组。您的意思是只需要获得带双引号的子字符串吗?例如?第1行和第2行的预期输出是什么?也许可以?为什么不简单地选择两个
\”之间的所有内容?像
\“*\”
。您可以对有效性字符串进行计算前检查,确保
\“
是一对数字,以避免误报。请参阅-我刚刚修改了它以返回第一个匹配项。它对您有效吗?
String line = "\"USE CODE \"\"Gef, sdf\"\" FROM 1/7/07\", Delete , Hello , How are you ? , ";
String line2 = "Test asda ds asd, tesat2 . test3";
Pattern pattern = Pattern.compile("(?:\"[^\"]*(?:\"\"[^\"]*)*\"|[^,])+");
Matcher matcher = pattern.matcher(line);
if (matcher.find()){                        // if is used to get the 1st match only
    System.out.println(matcher.group(0)); 
}
Matcher matcher2 = pattern.matcher(line2); 
if (matcher2.find()){
    System.out.println(matcher2.group(0)); 
}