我的字符串包含$ OR $$符号之间的单词。如果这些分隔的单词不被单引号括起来,我必须用其他单词替换这些单词。
示例:
原始字符串:
$ quick $ brown '$$ fox $$'跳过 $$超过$$ '$ lazy $'狗
替换后的字符串应为:
替换布朗'$$ fox $$'跳替换 '$ lazy $'狗
到目前为止,我已经提出了正则表达式
\$[^$]+\$|\${2}[^$]+\${2}
这匹配字符串中的所有模式,而不管单引号。我怎样才能忽略单引号中的内容?
答案 0 :(得分:1)
您可以使用这样的外观。
正则表达式: (?<=\s)([$]{1,2})[^\$]*\1(?=\s)
说明:
(?<=\s)
是whitespace
的正面观察,用于检查前一个字符是否为空格。如果'
存在,那么它就不会匹配。
([$]{1,2})[^\$]*\1
匹配$
或$$
之间的字词。
([$]{1,2})
捕获$
或$$
并使用捕获组\1
在单词结尾处第二次匹配。
[^\$]*
匹配word,直到找到$
。
(?=\s)
检查单词后是否存在空格。
替换替换为您想要的任何字词。
<强> Regex101 Demo 强>
更新:对于下面的单词出现在开头或结尾的情况。
<$> $ Hello $ $ quick $ brown&#39; $$ fox $$&#39;跳过$$超过$ $懒惰$&#39;狗$ Hello $
使用此正则表达式。
正则表达式: (?:(?<=\s)|(?<=^))([$]{1,2})[^\$]*\1(?=\s|$)
(?:(?<=\s)|(?<=^))
关注whitespace
或beginning of string.
(?=\s|$)
展望whitespace
或end of string.
<强> Regex101 Demo 强>
答案 1 :(得分:1)
跳过某些内容的最常见方法是匹配并捕获它(以便稍后恢复该值)并匹配您不需要的内容。
请参阅C# demo(s
代表输入字符串,p
代表模式和m
代表< EM>匹配):
using System;
using System.Text.RegularExpressions;
using System.Linq;
public class Test
{
public static void Main()
{
var s = "The $quick$ brown '$$fox$$' jumps $$over$$ the '$lazy$' dog";
var p = @"(?x)
(?<quote>'[^'\\]*(?:\\.[^\\']*)*') # A single quoted string literal pattern
| # or
(?<!\$) # no $ immediately to the left
(\${1,2}) # 1 or 2 $ symbols (Group 1)
[^$]+ # 1 or more non-$ chars
\1 # Same value as in Group 1 (backreference)
(?!\$) # No $ immediately to the left of the current location
";
var result = Regex.Replace(s, p, m =>
m.Groups["quote"].Success ? m.Groups["quote"].Value : "substituted");
Console.WriteLine(result);
// => The substituted brown '$$fox$$' jumps substituted the '$lazy$' dog
}
}
正则表达式基本匹配'...'
子字符串,将它们放入quote
命名组,然后第二部分仅匹配$...$
或$$...$$
子字符串。 Regex.Replace(s, p, m => m.Groups["quote"].Success ? m.Groups["quote"].Value : "substituted")
检查quote
组是否参与了匹配,如果是,则只需将该文本重新插入结果中。否则,就会发生替代。