C# string.IndexOf搜索整词匹配
我正在寻找一种方法来搜索字符串以获得精确匹配或整词匹配C# string.IndexOf搜索整词匹配,c#,regex,string,substring,indexof,C#,Regex,String,Substring,Indexof,我正在寻找一种方法来搜索字符串以获得精确匹配或整词匹配RegEx.Match和RegEx.IsMatch似乎无法让我达到我想要的位置考虑以下情况: namespace test { class Program { static void Main(string[] args) { string str = "SUBTOTAL 34.37 TAX TOTAL 37.43"; int indx = str
RegEx.Match
和RegEx.IsMatch
似乎无法让我达到我想要的位置考虑以下情况:
namespace test
{
class Program
{
static void Main(string[] args)
{
string str = "SUBTOTAL 34.37 TAX TOTAL 37.43";
int indx = str.IndexOf("TOTAL");
string amount = str.Substring(indx + "TOTAL".Length, 10);
string strAmount = Regex.Replace(amount, "[^.0-9]", "");
Console.WriteLine(strAmount);
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}
上述代码的输出为:
// 34.37
// Press any key to continue...
问题是,我不想要小计
,但是索引
找到总计
中的单词小计
的第一个匹配项,然后生成不正确的值34.37
所以问题是,有没有一种方法可以强制IndexOf
只找到一个精确匹配,或者有没有另一种方法可以强制整个单词精确匹配,这样我就可以找到这个精确匹配的索引,然后用它执行一些有用的功能<就我所知,code>RegEx.IsMatch和RegEx.Match
只是boolean
搜索。在这种情况下,仅仅知道精确匹配的存在是不够的。我需要知道它在字符串中的位置
如果您有任何建议,我们将不胜感激。尽管这可能只是一种仅适用于您的示例的黑客攻击,请尝试
string amount = str.Substring(indx + " TOTAL".Length, 10);
在总计之前给一个额外的空间。由于小计
不会出现这种情况,因此它应该跳过您不想要的单词,只查找一个单独的总计
,您可以使用正则表达式
string str = "SUBTOTAL 34.37 TAX TOTAL 37.43";
var indx = Regex.Match(str, @"\WTOTAL\W").Index; // will be 18
我也推荐L.B.的正则表达式解决方案,但是如果你不能使用正则表达式,那么你可以使用String.LastIndexOf(“TOTAL”)。假设总数总是在小计之后
我的方法比公认的答案快,因为它不使用正则表达式
string str = "SUBTOTAL 34.37 TAX TOTAL 37.43";
var indx = str.IndexOfWholeWord("TOTAL");
public static int IndexOfWholeWord(this string str, string word)
{
for (int j = 0; j < str.Length &&
(j = str.IndexOf(word, j, StringComparison.Ordinal)) >= 0; j++)
if ((j == 0 || !char.IsLetterOrDigit(str, j - 1)) &&
(j + word.Length == str.Length || !char.IsLetterOrDigit(str, j + word.Length)))
return j;
return -1;
}
string str=“小计34.37税合计37.43”;
var indx=str.IndexOfWholeWord(“总计”);
公共静态int IndexOfWholeWord(此字符串str,字符串字)
{
对于(int j=0;j=0;j++)
如果((j==0 | |!char.isleterordigit(str,j-1))&&
(j+word.Length==str.Length | |!char.isleterordigit(str,j+word.Length)))
返回j;
返回-1;
}
您可以使用,并且:
var text=“小计34.37税合计37.43”;
var idx=Regex.Match(text,@“\b总计\b”).Index;
// => 19
看
\b总计\b
与未包含任何其他字母、数字或下划线的总计相匹配
如果你需要把一个单词作为一个整体来计算,如果它是用下划线括起来的,那么使用
var idx=Regex.Match(text,@)(?使接受的答案更安全一点(因为IndexOf
返回-1表示不匹配):
str.IndexOf(“TOTAL”);
但它很难看。哈哈!!!我为什么没看到呢!它有点“黑”“但仅举我的例子,它应该有效。我真的很想看看是否有办法以更干净的方式强制整个单词匹配,但如果我在一天左右没有看到更精确的答案,我会将其标记为答案。非常感谢!!!:)谢谢!这更干净了!谁知道有一个“.Index”挂在RegEx.match上?:):):)不久前,有一篇关于这个答案的帖子使用了一个正则表达式模式,该模式返回与“TOTAL”完全匹配的数字。还有其他人看到了吗?有人愿意加入这种模式吗?@DJ您是在寻找类似于var val=Regex.Match(str,@“\WTOTAL\W\s*([0-9\.]+)”)的东西。组[1]。值代码>哇!我必须学习更多关于正则表达式的知识。它似乎非常强大,如果不是非常直观的话。谢谢你!如果TOTAL不在行中,则返回-1,这也更灵活。上面的正则表达式返回0。
string pattern = String.Format(@"\b{0}\b", findTxt);
Match mtc = Regex.Match(queryTxt, pattern);
if (mtc.Success)
{
return mtc.Index;
}
else
return -1;