Если у вас есть для использования регулярного выражения, вы можете сделать это, если уверены, что все кавычки правильно сбалансированы, и если в строке нет экранированных кавычек (\"
) (этоих тоже можно учесть, но это делает регулярное выражение еще более сложным).
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);
Это проверяет остаток строки, чтобы утверждать четное число кавычек после текущего символа пробела.Преимущество lookahead (спасибо Алану Муру!) Заключается в том, что он более переносим, чем lookbehind (большинство разновидностей regex, за исключением .NET и некоторых других, не поддерживают неопределенное повторение внутри утверждений lookbehind).Это также может быть быстрее.
Исходное решение с использованием 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, followed by 0+ non-quotes
""[^""]* # a second quote and 0+ non-quotes
)* # any number of times, ensuring an even number of quotes
) # End of lookbehind
[ ] # Match a space (brackets for legibility)",
"%", RegexOptions.IgnorePatternWhitespace);