我有一个编写C#应用程序来解析xml文件的任务。文件中的一个属性值是Replace语句,我必须解析它以创建PowerShell Replace语句。我正在使用正则表达式来执行此操作。字符串如下所示:
替换(FileName," .txt"," .doc")
我想捕获" FileName"," .txt"和" .doc"
我的问题是,如何匹配开放(左)的parens和双引号?
我的问题是,我无法使用
@"\"pattern\""
因为' @'符号不识别转义的双引号(在VS 2015中)。如果我删除了' @',那我该如何逃避开放(左)的parens?我无法使用
"\("
作为转义序列b / c编译器说,"无法识别的转义序列"。
无论如何,所有的帮助都表示赞赏。
答案 0 :(得分:0)
示例正则表达式看起来像
^Replace\((\w+)\s*,\s*("[^"]*")\s*,\s*("[^"]*")\)$
请参阅regex demo
要在C#中定义它,您可以在需要的地方选择常规字符串文字(支持转义序列,如文字换行符\n
)逃避双引号和双重转义特殊正则表达式字符(因为正则表达式引擎需要\d
或\.
中的字面反斜杠来分别匹配数字或点):
var pattern = "^Replace\\((\\w+)\\s*,\\s*(\"[^\"]*\")\\s*,\\s*(\"[^\"]*\")\\)$";
或使用逐字字符串文字(不解析转义序列,@"\d"
是一个包含2个字符\
和d
的字符串,匹配一个数字)以避免使用\
过度转换,但你需要加倍双引号以在字符串中插入文字双引号:
var pattern = @"^Replace\((\w+)\s*,\s*(""[^""]*"")\s*,\s*(""[^""]*"")\)$
答案 1 :(得分:0)
试试这个
string t = @" name ""test""";
Console.WriteLine(t);
输出是==>名称“test”
答案 2 :(得分:0)
格式化为可读的正则表达式:
var pattern =@"
Replace
\(
(?<filename>\w+)
\,\s*
\u0022 # double quote
\.
(?<txt>\w+)
\u0022
,\s*
\u0022
\.
(?<doc>\w+)
“;
unicode \ u0022是双引号
以下类解析文本并提取文件名,Txt和Doc:
class RegParser
{
public string FileNmae { get; set; }
public string Doc { get; set; }
public string Txt { get; set; }
private static string pattern = @"
Replace
\(
(?<filename>\w+)
\,\s*
\u0022 # double quote
\.
(?<txt>\w+)
\u0022
,\s*
\u0022
\.
(?<doc>\w+)
";
private Regex regex = new Regex(pattern,
RegexOptions.Singleline
| RegexOptions.ExplicitCapture
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
public void Parse(string text)
{
Console.WriteLine("text: {0}",text);
Match m = regex.Match(text);
FileNmae = m.Groups["filename"].ToString();
Doc = m.Groups["doc"].ToString();
Txt = m.Groups["txt"].ToString();
}
}
示例输出:
text: Replace(FileName, ".txt", ".doc")
FileNmae: FileName
Doc: doc
Txt: txt