我有一个C#应用程序,它读取word文件并查找包含在<括号>
目前正在使用以下代码和正则表达式。
private readonly Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);
我已经使用了几个在线测试工具/朋友来验证正则表达式的工作原理,我的应用证明了这一点(对于那些在家里玩的人来说,http://wordfiller.codeplex.com)!
然而,我的问题是正则表达式还会带来额外的垃圾。
E.G
I'm walking on <sunshine>.
将返回
sunshine>.
它应该返回
<sunshine>
任何人都知道我的申请拒绝遵守规则的原因吗?
答案 0 :(得分:5)
我认为这个问题根本不是你的正则表达式。它可以稍微改进 - 你不需要每个括号周围的([])
- 但这不应该影响结果。 我强烈怀疑问题在于你的C#实现,而不是你的正则表达式。
您的正则表达式应将<sunshine>
拆分为三个单独的组:<
,sunshine
和>
。使用下面的代码测试它,这正是它的作用。我的怀疑是,在C#代码的某个地方,你将第3组追加到第2组而没有意识到。一些快速的C#实验支持这一点:
private readonly Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);
private string sunshine()
{
string input = "I'm walking on <sunshine>.";
var match = _regex.Match(input);
var regex2 = new Regex("<[^>]*>", RegexOptions.Compiled); //A slightly simpler version
string result = "";
for (int i = 0; i < match.Groups.Count; i++)
{
result += string.Format("Group {0}: {1}\n", i, match.Groups[i].Value);
}
result += "\nWhat you're getting: " + match.Groups[2].Value + match.Groups[3].Value;
result += "\nWhat you want: " + match.Groups[0].Value + " or " + match.Value;
result += "\nBut you don't need all those brackets and groups: " + regex2.Match(input).Value;
return result;
}
Group 0: <sunshine>
Group 1: <
Group 2: sunshine
Group 3: >
What you're getting: sunshine>
What you want: <sunshine> or <sunshine>
But you don't need all those brackets and groups: <sunshine>
答案 1 :(得分:3)
我们需要查看更多代码来解决问题。您的代码中某处出现 off by one 错误。该正则表达式不可能返回sunshine>.
。因此,正则表达式不是问题。我会假设,没有更多细节,有些东西正在将索引放入包含你的匹配的字符串中,而且它是字符串中的一个字符。
答案 2 :(得分:2)
如果你想要的只是&lt;之间的文字。和&gt;然后你最好使用:
[<]([^>]*)[>] or simpler: <([^>]+)>
如果你想包括&lt;和&gt;然后你可以使用:
([<][^>]*[>]) or simpler: (<[^>]+>)
你的表达目前有3个组匹配 - 用括号()表示。
在&lt;阳光&GT;这将返回以下内容:
第1组:“&lt;”
第2组:“阳光”
第3组:“&gt;”
所以如果你只看第二组就应该有效!
我可以为您观察到的行为提供的唯一解释是,在您拉出比赛的地方,您将第2 + 3组加在第2组而不是第1组。
答案 3 :(得分:1)
你发布的内容完美无缺。
Regex _regex = new Regex("([<])([^>]*)([>])", RegexOptions.Compiled);
string test = "I'm walking on <sunshine>.";
var match = _regex.Match(test);
匹配为<sunshine>
我想您需要提供更多代码。
答案 4 :(得分:0)
默认情况下,正则表达式非常渴望。教它懒惰!
我的意思是,*运算符考虑尽可能多的重复(据说它很渴望)。使用 *?相反,这告诉Regex考虑尽可能少的重复(即懒惰):
<.*?>
答案 5 :(得分:-1)
因为您使用的是括号,所以您正在创建匹配的组。这导致匹配集合与正则表达式创建的组匹配也匹配。您可以将正则表达式缩减为[<][^>]*[>]
,它只会与&lt; text&gt;匹配。你想要的。