正则表达式 - 我如何匹配索引路径的第一部分

时间:2017-09-26 01:20:25

标签: c# regex

为行

[random.expovariate(.15) for i in range(50)]

我想匹配路径的第一部分,包括第一部分[,n和]以及第一部分 所以对于上面的行我会得到

Tester[0]/Test[4]/testId
Tester[0]/Test[4]/testId
Test[1]/Test[4]/testId
Test[2]/Test[4]/testId

我尝试过使用

Tester[0]
Tester[0]
Test[1]
Test[2]

我得到了

var rx = new Regex(@"^\[.*\]\/");
var res = rx.Replace("Tester[0]/Test[4]/testId", "", 1 /*only one occurrence */);

而不是

res == "testId";

这是我希望的 所以它匹配第一个开放方括号和最后一个右括号。 我需要它只匹配第一个右括号

更新 对不起,我也试图匹配第一个正斜杠。

res == "Test[4]/testId"

解决方案: 使用"?"

删除第一场比赛
Tester[0]/
Tester[0]/
Test[1]/
Test[2]/

3 个答案:

答案 0 :(得分:1)

我假设这是你原来的正则表达式模式:^.*\[.*\]/(你问题中的模式与行不匹配)。

此模式使用贪心量词(*),因此,即使我们只请求了一个匹配,模式本身也会比我们想要的更匹配。正如您所注意到的,它匹配到第二次出现方括号。

我们可以通过向量词添加问号来使这种模式非贪婪^.*?\[.*?\]/

虽然这适用于您的用例,但更好的模式可能是:^[^/]+/。这将删除任何字符,直到第一个正斜杠。 [^ ... ]是一个负字符类(括号与我们匹配的字符串中的括号无关)。在这种情况下,它匹配不是正斜杠的任何字符。

对于这种简单的文本操作,我们可以使用String.Substring()而不是正则表达式:

line.Substring(line.IndexOf('/') + 1);

这比正则表达式模式更快更容易理解。

答案 1 :(得分:0)

这是你要找的东西吗?

<强>更新

var str="Tester[0]/Test[4]/testId\nTester[0]/Test[4]/testId\nTest[1]/Test[4]/testId\nTest[2]/Test[4]/testId"

console.log(str)
//  Tester[0]/Test[4]/testId
//  Tester[0]/Test[4]/testId
//  Test[1]/Test[4]/testId
//  Test[2]/Test[4]/testId

var str2=str.replace(/\/.+/mg,"")

console.log(str2)
//  Tester[0]
//  Tester[0]
//  Test[1]
//  Test[2]

这可以通过在第一个&#39; /&#39;开始比赛来实现。然后在该行结束时结束并用&#34;替换此匹配&#34 ;. m标志多行和g标志进行全局匹配。

答案 2 :(得分:0)

您可以使用lookaheadlookbehind方法查找匹配项并进行相应替换:

使用lookaround方法,你的正则表达式将是这样的:

(?=/).*(?<=])