如何删除不平衡/未对齐的双引号(在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"
'