.NET正则表达式:删除匹配序列

4
我的正则表达式知识有限,需要您的帮助。
我正在尝试处理一个字符串输入,可能是以下格式之一。
@"RRR:domsd\ddf:sdf:dsf:f"

或者

@"sds4:kwertss\wegggds:rowdf"

在这两种情况下,从开始到第一个出现的\之后的所有内容都会被剥离,但是在第一个\之后出现的第一个:之前的所有内容也会被剥离。

因此,结果将是:

RRR:domsd\ddf
sds4:kwertss\wegggds

如果没有找到: \ :序列,则应该说明状态匹配失败。

我已经尝试了以下两种正则表达式:

1. @".*[:].*[\\].*[:]" 可以匹配最后一个:之前的所有内容,但无法匹配第一个\之后的内容。

2. @"(.+?:.+?):(.+)" 只能匹配整个字符串。


@"^(.*\\[^:]*)"? - Mathias R. Jessen
3个回答

3

看起来你需要使用否定字符类

^[^:]*:[^\\]*\\[^:]*(?=:)

请查看 正则表达式演示

详细信息:

  • ^ - 字符串的起始位置
  • [^:]* - 除了:之外的0个或多个字符
  • : - 冒号
  • [^\\]* - 除了\之外的0个或多个字符
  • \\ - 实际的\
  • [^:]* - 除了:之外的0个或多个字符
  • (?=:) - 零宽度正预测,需要一个:.

C#代码:

var m = Regex.Match(s, @"^[^:]*:[^\\]*\\[^:]*(?=:)");
var res = string.Empty;
if (m.Success) 
{
     res = m.Value;
}

你的答案是正确的,但如果没有找到 :\ 序列,它就不会失败。你缺少一个 : 在结尾处。^(.*:.*[\\][^:]*): - AxelWass
1
是的,让我们添加 (?=:) - Wiktor Stribiżew

0
你可以使用正则表达式:^(.*:.*[\\][^:]*):。 如果没有找到: \ :序列,则会失败。 匹配的部分将在括号之间。

这里您可以看到演示。


0

你可以使用正则表达式(带有全局和多行标志)

(^.*\\.*?):

请查看演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接