为行
[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]/
答案 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)
您可以使用lookahead
和lookbehind
方法查找匹配项并进行相应替换:
使用lookaround
方法,你的正则表达式将是这样的:
(?=/).*(?<=])