为什么我的正则表达式模式在C#中返回空字符串?

为什么我的正则表达式模式在C#中返回空字符串?,c#,regex,C#,Regex,我有一个字符串,其格式为\\\State\city“ 我只想将State部分和city部分返回到各自的变量中 我尝试使用模式^\\\\[a-zA-Z]\返回状态部分,然后使用模式^\\\[a-zA-Z]返回城市部分。结果总是空字符串 state = Regex.Match("\\\Washington\\Seattle","^\\\\[a-zA-Z]\"].ToString(); 您需要在正则表达式中转义反斜杠。因此,任何地方只要有一个\,就会有\\ 而

我有一个字符串,其格式为
\\\State\city“

我只想将State部分和city部分返回到各自的变量中

我尝试使用模式
^\\\\[a-zA-Z]\
返回状态部分,然后使用模式
^\\\[a-zA-Z]
返回城市部分。结果总是空字符串

state = Regex.Match("\\\Washington\\Seattle","^\\\\[a-zA-Z]\"].ToString();

您需要在正则表达式中转义反斜杠。因此,任何地方只要有一个
\
,就会有
\\

而且
[a-zA-Z]
将只匹配一次。使用
+
可匹配一次或多次

这将使您的州正则表达式:

^\\\[a-zA-Z]+\\\

此外,C#中字符串中的反斜杠也需要转义。因此,请再次加倍,或使用
@
字符:

state = Regex.Match(@"\\Washington\Seattle",@"^\\\\[a-zA-Z]+\\").ToString();

您只允许一个字符位于反斜杠之间。您真正想要的是带星号的
[a-zA-Z]*

试试这个非正则表达式的答案:

string data = @"\\Washington\Seattle";
string state = data.Trim('\\').Split('\\')[0];
string city = data.Trim('\\').Split('\\')[1];

Console.WriteLine("{0}, {1}", city, state);

这是修剪双反斜杠,然后在第一个反斜杠处拆分。

反斜杠用作转义字符。对于每个(
\
)反斜杠,需要两个反斜杠(
\

另外,在第二个正则表达式示例中,您不需要线锚的开头,因为该部分显然不在字符串的开头。下面是一个如何执行此操作的示例

String s = @"\\Washington\Seattle";
Match m  = Regex.Match(s, @"(?i)^\\\\([a-z]+)\\([a-z]+)");

if (m.Success) {
   String state = m.Groups[1].Value;
   String city  = m.Groups[2].Value;

   Console.WriteLine("{0}, {1}", city, state); // => "Seattle, Washington"
} 

考虑以下代码以匹配州和市

var state = Regex.Match(@"\\Washington\Seattle", @"(?<=\\\\).*(?=\\)");
var city = Regex.Match(@"\\Washington\Seattle", @"(?<=\\\\.*?\\).*");

<代码> var状态=正则表达式。匹配(@“\\\\华盛顿西雅图”,@“(不应该有四个反斜杠)\\\\\\Waeld\\\西雅图”?考虑使用像ExpSO这样的工具,或者可以找到相对容易使用的在线正则表达式验证器之一。它甚至会为您创建C或VB.NET代码。< /代码>格式化。(那么你就不必再担心反斜杠问题了。)为什么不用一个空字符串替换双反斜杠开始呢?或者甚至在反斜杠上拆分,然后用字符串2和3代替0和1?真的,我会修剪字符串中的反斜杠,然后在中间的一个上分割。<代码> DATA。.Split('\\');@JoelRondeau我更喜欢你的想法…更新我的答案可能是
+
。想要1或更多,而不是0或更多。这对格式良好的输入有效。如果正则表达式也要验证(问题不清楚)它可以接受一些无效的数据strings@BenAaronson我修复了它。你的模式很完美。你能用简单的术语描述一下这个模式在做什么吗?我正在尝试使用来自msdn的正则表达式quickreference来破译它,我很难理解。第一个模式看起来是前缀\\和后缀\并取两者之间的内容。第二个模式是tern查找前缀\(任意字符串)\n并获取其后的任何内容。如果您需要更多信息,请告诉我。我想我现在找到了,(?)?