如何删除不平衡/未对齐的双引号(在Java中)

如何删除不平衡/未对齐的双引号(在Java中),java,regex,string-parsing,Java,Regex,String Parsing,我想和这里的每个人分享这个相对聪明的问题。 我试图从字符串中删除不平衡/不成对的双引号 我的工作正在进行中,我可能接近解决方案。但是,我还没有找到有效的解决方案我无法从字符串中删除未配对/未配对的双引号。 示例输入 string1=injunct! alter ego." string2=successor "alter ego" single employer" "proceeding "citation assets" 输出应为 string1=injunct! alter ego. s

我想和这里的每个人分享这个相对聪明的问题。 我试图从字符串中删除不平衡/不成对的双引号

我的工作正在进行中,我可能接近解决方案。但是,我还没有找到有效的解决方案我无法从字符串中删除未配对/未配对的双引号。

示例输入

string1=injunct! alter ego."
string2=successor "alter ego" single employer"  "proceeding "citation assets"
输出应为

string1=injunct! alter ego.
string2=successor "alter ego" single employer  proceeding "citation assets"
这个问题听起来很像

这是我到目前为止的代码(它不会删除所有未配对的双引号)

private String removeUnattachedDupleQuotes(String stringWithDoubleQuotes){
字符串firstPass=“”;
字符串openingQuotePattern=“\\\”[a-z0-9\\p{Punct}];
字符串closingQuotePattern=“[a-z0-9\\p{Punct}]\\”;
int doubleQuoteLevel=0;
对于(int i=0;i0){
双引号级--;
首次通过+=c;
}
}
否则{
首次通过+=c;
}
}
字符串secondPass=“”;
doubleQuoteLevel=0;
对于(int i=firstPass.length()-1;i>=0;i--){
String c=stringWithDoubleQuotes.substring(i,i+2);
如果(c.匹配(closingQuotePattern)){
doubleQuoteLevel++;
secondPass=c+secondPass;
}
else if(c.匹配(openingQuotePattern)){
如果(doubleQuoteLevel>0){
双引号级--;
secondPass=c+secondPass;
}
}
否则{
secondPass=c+secondPass;
}
}
字符串结果=secondPass;
返回结果;
}

您可以使用(Perl表示法):


s/(“(?=\s)[^”]*(?如果没有嵌套,它可能在单个正则表达式中完成。
有一个粗略定义的delimeters的概念,可以“偏置”
这些规则可以获得更好的结果。
这完全取决于规定了哪些规则。此正则表达式考虑了
三种可能的情况依次出现

  • 有效对
  • 无效对(带偏差)
  • 无效单
  • 它也不会在行尾之外解析“”。但它会执行多个
    作为单个字符串组合的行。若要更改此设置,请在看到它的位置删除
    \n


    全局上下文-原始查找正则表达式
    缩短

    (?:("[a-zA-Z0-9\p{Punct}][^"\n]*(?<=[a-zA-Z0-9\p{Punct}])")|(?<![a-zA-Z0-9\p{Punct}])"([^"\n]*)"(?![a-zA-Z0-9\p{Punct}])|")
    
    扩展原始正则表达式:

    (?:                            // Grouping
                                      // Try to line up a valid pair
       (                                 // Capt grp (1) start 
         "                               // "
          [a-zA-Z0-9\p{Punct}]              // 1 of [a-zA-Z0-9\p{Punct}]
          [^"\n]*                           // 0 or more non- [^"\n] characters
          (?<=[a-zA-Z0-9\p{Punct}])         // 1 of [a-zA-Z0-9\p{Punct}] behind us
         "                               // "
       )                                 // End capt grp (1)
    
      |                               // OR, try to line up an invalid pair
           (?<![a-zA-Z0-9\p{Punct}])     // Bias, not 1 of [a-zA-Z0-9\p{Punct}] behind us
         "                               // "
       (  [^"\n]*  )                        // Capt grp (2) - 0 or more non- [^"\n] characters
         "                               // "
           (?![a-zA-Z0-9\p{Punct}])      // Bias, not 1 of [a-zA-Z0-9\p{Punct}] ahead of us
    
      |                               // OR, this single " is considered invalid
         "                               // "
    )                               // End Grouping
    

    请参阅第二段中粗体的句子。您得到了什么样的输出?目前,我得到了StringIndexOutOfBoundsException。我可能做得不对。这就是为什么我想从周围的人那里反弹它,如果有人已经做了类似的事情。要解决您的异常,请将for循环更改为
    stringWithDoubleQuotes.length()-3
    这样,当你尝试获取子字符串时,它不会咬你。我更改了循环。谢谢!但是,我的主要问题是,我得到了firstPass=innjjuunnctt!!alltteerr eeg。在第一个循环之后。我想要firstPass=injunct!alterego。谢谢!但是,我在删除未插入的双引号时遇到困难。我已经能够找到了所有使用RegEx的双引号。请看这里,您的解决方案将删除所有双引号。我的意思是只删除未经处理的双引号,而不是所有的双引号。如果我错了,请告诉我。@S.Singh,不,它不会删除所有的双引号…为什么不在发表评论之前测试我为您编写的完整Java指令它不工作?它对您的数据工作正常,请参阅。您的评论+1。对不起,我的不好。我是RegEx新手。是的,它确实工作。我会接受此解决方案。请您简要解释一下,它是如何工作的。您很出色:)它尝试匹配、使用和捕获您想要保留的引用
    “”
    ,如果找到它,它将被替换为它自己,如果没有,那么它将只匹配一个引号
    ,并将其删除。@S.Singh-感谢您提出这个问题。
    str.replaceAll("(\"(?=\\S)[^\"]*(?<=\\S)\")|\"", "$1");
    
    (?:("[a-zA-Z0-9\p{Punct}][^"\n]*(?<=[a-zA-Z0-9\p{Punct}])")|(?<![a-zA-Z0-9\p{Punct}])"([^"\n]*)"(?![a-zA-Z0-9\p{Punct}])|")
    
    $1$2 or \1\2
    
    (?:                            // Grouping
                                      // Try to line up a valid pair
       (                                 // Capt grp (1) start 
         "                               // "
          [a-zA-Z0-9\p{Punct}]              // 1 of [a-zA-Z0-9\p{Punct}]
          [^"\n]*                           // 0 or more non- [^"\n] characters
          (?<=[a-zA-Z0-9\p{Punct}])         // 1 of [a-zA-Z0-9\p{Punct}] behind us
         "                               // "
       )                                 // End capt grp (1)
    
      |                               // OR, try to line up an invalid pair
           (?<![a-zA-Z0-9\p{Punct}])     // Bias, not 1 of [a-zA-Z0-9\p{Punct}] behind us
         "                               // "
       (  [^"\n]*  )                        // Capt grp (2) - 0 or more non- [^"\n] characters
         "                               // "
           (?![a-zA-Z0-9\p{Punct}])      // Bias, not 1 of [a-zA-Z0-9\p{Punct}] ahead of us
    
      |                               // OR, this single " is considered invalid
         "                               // "
    )                               // End Grouping
    
    $str = '
    string1=injunct! alter ego."
    string2=successor "alter ego" single employer "a" free" proceeding "citation assets"
    ';
    
    print "\n'$str'\n";
    
    $str =~ s
    /
      (?:
         (
           "[a-zA-Z0-9\p{Punct}]
            [^"\n]*
            (?<=[a-zA-Z0-9\p{Punct}])
           "
         )
       |
           (?<![a-zA-Z0-9\p{Punct}])
           " 
         (  [^"\n]*  )
           " (?![a-zA-Z0-9\p{Punct}])
       |
           "
      )
    /$1$2/xg;
    
    print "\n'$str'\n";
    
    '
    string1=injunct! alter ego."
    string2=successor "alter ego" single employer "a" free" proceeding "citation assets"
    '
    
    '
    string1=injunct! alter ego.
    string2=successor "alter ego" single employer "a" free proceeding "citation assets"
    '