簡體   English   中英

C#正則表達式匹配在字符串中的特定索引?

[英]c# regular expression match at specific index in string?

我想測試一個正則表達式是否將在特定索引處匹配字符串的一部分(並且僅從該特定索引開始)。 例如,給定字符串“一二三四五”,我想知道在索引8處,正則表達式[0-9] +將匹配“ 3”。 RegularExpression.IsMatch和Match都采用起始索引,但是如果需要,它們都將在字符串的其余部分搜索匹配項。

string text="one two 3 4 five";
Regex num=new Regex("[0-9]+");

//unfortunately num.IsMatch(text,0) also finds a match and returns true
Console.WriteLine("{0} {1}",num.IsMatch(text, 8),num.IsMatch(text,0));

顯然,我可以檢查結果匹配是否從我感興趣的索引處開始,但是我將在大型字符串上進行大量的此操作,因此我不想浪費時間在字符串的后面搜索匹配項。 另外,我不會事先知道我將實際針對字符串測試哪些正則表達式。

我不想:

  1. 在某些邊界(例如空格)上分割字符串,因為在我的情況下,我無法預先知道合適的邊界是什么
  2. 必須以任何方式修改輸入字符串(例如在索引8處獲取子字符串,然后在正則表達式中使用^)
  3. 搜索字符串的其余部分以查找匹配項,或者對大型字符串執行大量測試無法執行的其他任何操作。

我想使用任意用戶提供的語法來分析可能由用戶提供的大量文本。 語法將以類似於BNF或PEG的語法定義,並且終端將為字符串文字或正則表達式。 因此,我將需要檢查字符串的下一部分是否與語法所驅動的任何潛在端子相匹配。

如何使用以\\G開頭的正則表達式來使用Regex.IsMatch(string, int) (意味着“最后一場比賽的開始”)?

看來可行:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text="one two 3 4 five";
        Regex num=new Regex(@"\G[0-9]+");

        Console.WriteLine("{0} {1}",
                          num.IsMatch(text, 8), // True
                          num.IsMatch(text, 0)); // False
    }
}

如果只想搜索文本的子字符串,請在正則表達式之前獲取該子字符串。

myRegex.Match(myString.Substring(8, 10));

我不確定我是否完全理解這個問題,但是在我看來,您可以簡單地將位置設為正則表達式的一部分,例如

^.{8}[\d]

如果字符串的開頭和數字之間有8個字符,則將匹配。

如果您知道字符串中潛在匹配項的最大長度,請檢查該長度是否會限制字符串的掃描。

如果只檢查數字,則比檢查任意表達式要容易。 正則表達式的本質是掃描到最后以找到匹配項。 如果要防止掃描,則需要包含長度,或者使用Regex以外的其他內容。

string text = "one two 3 4 five";
Regex num = new Regex("[0-9]+");
int indexToCheck = 8;
int maxMatchLength = ...;
Match m = num.Match(text, indexToCheck, maxMatchLength);

您是否知道關於字符串可以運行哪種類型的表達式的信息,並且掃描整個字符串會產生過多的開銷嗎?

如果存在,num.Match將返回第一個匹配項,然后停止掃描。 如果需要更多匹配項,則可以調用m.NextMatch()繼續掃描匹配項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM