如何解决使用正则表达式替换引号外的空格
| 使用C#,我需要准备一个搜索文本,以使用LIKE命令在SQL Server数据库中进行搜索,方法是用%字符替换引号之外的所有空格。例: 输入:my \"search text\"
输出:
%my%search text%
任何帮助,将不胜感激。在替换文本之前,我可以用奇数的引号处理输入字符串。
解决方法
如果必须使用正则表达式,可以确保所有引号正确平衡,并且字符串中没有转义的引号(
\\\"
)(也可以考虑这些引号),则可以这样做。正则表达式更加复杂)。
resultString = Regex.Replace(subjectString,@\"[\\ ] # Match a space (brackets for legibility)
(?= # Assert that the string after the current position matches...
[^\"\"]* # any non-quote characters
(?: # followed by...
\"\"[^\"\"]* # one quote,followed by 0+ non-quotes
\"\"[^\"\"]* # a second quote and 0+ non-quotes
)* # any number of times,ensuring an even number of quotes
$ # until the end of the string
) # End of lookahead\",\"%\",RegexOptions.IgnorePatternWhitespace);
这将检查字符串的其余部分,以在当前空格字符之后声明偶数个引号。先行的优势(感谢Alan Moore!)比后向更具可移植性(除了.NET和其他少数正则表达式之外,大多数正则表达式版本都不支持后向断言内部的无限重复)。它也可能会更快。
涉及lookbehind的原始解决方案如下:
resultString = Regex.Replace(subjectString,@\"(?<= # Assert that the string up to the current position matches...
^ # from the start of the string
[^\"\"]* # any non-quote characters
(?: # followed by...
\"\"[^\"\"]* # one quote,ensuring an even number of quotes
) # End of lookbehind
[ ] # Match a space (brackets for legibility)\",RegexOptions.IgnorePatternWhitespace);
,不要使用ѭ5,而是使用简单的状态机-遍历每个字符,注意是引号是\“ in \”还是\“ out \”,并且仅当处于\“ out \”状态时才替换空格。
,如果双引号没有以某种方式转义,则以下是另一种可能。可能不如某些方法有效(当然不如Tim的regex那样酷),但是当下一个家伙查看代码时,这可能是可以理解的。它将字符串用双引号引起来,然后循环遍历值。奇数条目是引号之外的部分,即使条目也是引号内的那些部分。
string value = \"\\\"first\\\" some text \\\"other in quotes\\\" out of them \\\"in them\\\"\";
string[] sets = value.Split(\'\\\"\' );
StringBuilder newvalue = new StringBuilder(\"%\");
for (int i = 0; i < sets.Length; i++) {
if ( i % 2 == 0 )
// even ones are outside quotes
newvalue.Append( sets[i].Replace( \' \',\'%\' ));
else
// and the odd ones are in quotes
newvalue.Append( \"\\\"\" + sets[i] + \"\\\"\" );
}
// final %
newvalue.Append(\"%\");
,看来您也想删除引号,并在搜索字符串的开头和结尾添加一个“ 7”。尝试这个:
string s0 = @\"my \"\"search text\"\"\";
Regex re = new Regex(@\"(?x)
(?:
(?<term>[^\\s\"\"]+)
|
\"\"(?<term>[^\"\"]+)\"\"
)
(?:\\s+|$)\");
string s1 = @\"%\" + re.Replace(s0,@\"${term}%\");
Console.WriteLine(s1);
输出:
%my%search text%
,会做这样的事情:
private static string RemoveUnquotedWhiteSpaces(string text)
{
string result = String.Empty;
var parts = text.Split(\'\"\');
for(int i = 0; i < parts.Length; i++)
{
if (i % 2 == 0) result += Regex.Replace(parts[i],\" \",\"\");
else result += String.Format(\"\\\"{0}\\\"\",parts[i]);
}
return result
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。