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;