正则表达式,用于查找引号之间的匹配项

时间:2019-06-01 06:59:45

标签: java regex regex-lookarounds regex-negation regex-greedy

我在这里试图在String中找到double quotes

   List<String> getList(String value){
    String regex = "\"[^\"]*\"|[^,]+";
    List<String> allMatches = new ArrayList<String>();
    if (StringUtils.isNotBlank(value)) {
        Matcher m = Pattern.compile(regex).matcher(value);
        while (m.find() && StringUtils.isNotBlank(m.group())) {
            String str=m.group().replaceAll("^\"|\"$", "");
            allMatches.add(str.trim());
        }
    }
    return allMatches;
  }

  result = getList(400,test,\"don't split, this\",15);
  result have [400,test,don't split, this,15] all comma seperated string except inside quotes.

对于模式""来说效果很好,但对于“”来说效果不好。 "foo,bar""foo,bar" here is not working regex

不同

3 个答案:

答案 0 :(得分:1)

如果不同的引号应该匹配但不能混用,则可以使用alternation来匹配任何一种格式。如果不想匹配换行符,可以将其添加到否定的字符类中。

(?:“[^“”]+”|"[^"]+"|(?<=,|^)[^“”,"]+(?=(?:,|$)))

说明

  • (?:非捕获组
    • “[^“”]+”匹配变体,然后不匹配并匹配变体
    • |
    • "[^"]+",先匹配",然后再匹配",然后"
    • |
    • (?<=,|^)声明左侧的逗号或字符串开头
    • [^“”,"]+匹配任何不在字符类中的字符
    • (?=(?:,|$))声明右边的是逗号或字符串的结尾
  • )关闭非捕获组

Regex demo | Java demo

整个模式是一个交替,有3个选项。前两个选项从开始报价到结束报价匹配。

第三个选项会匹配除引号或逗号之外的所有类型,但要确保在匹配的开始和结尾都存在逗号或字符串的开头或结尾。

答案 1 :(得分:1)

您可以使用Java代码进行CSV样式的混合,但是必须更改正则表达式。

Java

margin: 0 !important;

https://ideone.com/b8Wnz9

输出

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{

    public static List<String> getList(String value)
    {
        String regex = "(?:(?:^|,|\\r?\\n)\\s*)(?:(?:(\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|“[^“”\\\\]*(?:\\\\[\\S\\s][^“”\\\\]*)*”))(?:\\s*(?:(?=,|\\r?\\n)|$))|([^,]*)(?:\\s*(?:(?=,)|$)))"; 
        List<String> allMatches = new ArrayList<String>();
        if ( value.length() > 0  )
        {
            Matcher m = Pattern.compile( regex ).matcher( value );
            while ( m.find() ) {
                String str = m.group(2);
                if ( str == null ) {
                    str = m.group(1);
                    str = str.replaceAll( "^[\"“”]|[\"“”]$", "" );
                }
                allMatches.add(str.trim());
            }
        }
        return allMatches;
    }


    public static  void main (String[] args) throws java.lang.Exception
    {
        List<String>  result = getList("400,test,\"QT_don't split, this_QT\",15");
        System.out.println( result );

        result = getList("500,test,“LQT_don't split, this_RQT”,15");
        System.out.println( result );

        result = getList("600,test,\"QT_don't split, this_QT\",15");
        System.out.println( result );

    }
}

正则表达式扩展

[400, test, QT_don't split, this_QT, 15]
[500, test, LQT_don't split, this_RQT, 15]
[600, test, QT_don't split, this_QT, 15]

答案 2 :(得分:-1)

尝试一下:

Pattern regex = Pattern.compile("[\"\u201C](.*)[\"\u201D]");
List<> allMatches = new ArrayList<String>();
Matcher m = regex.matcher(value);
while (m.find()) {
    allMatches.add(m.group(1).trim());
}

简单得多,并且完全满足您的要求(匹配普通引号或'nice'引号,但如果您混合使用它们,或者如果您无法启动或关闭它们,则不匹配)。