C# C搜索具有特定长度的特定字符串

C# C搜索具有特定长度的特定字符串,c#,regex,search,C#,Regex,Search,我有一个巨大的xml,我应该在其中搜索特定的字符串 字符串长度必须为13个字母,并且必须全部为数字 我相信使用regex适合这种应用,但我对regex的了解有限,因此任何类型的示例都是有用的 还有哪些其他方法可用于此类字符串搜索应用程序 <field name="TKT"> <item> <index>1</index> <text>Y24AUGXLOWS 2352159617737</t

我有一个巨大的xml,我应该在其中搜索特定的字符串

字符串长度必须为13个字母,并且必须全部为数字

我相信使用regex适合这种应用,但我对regex的了解有限,因此任何类型的示例都是有用的

还有哪些其他方法可用于此类字符串搜索应用程序

  <field name="TKT">
    <item>
      <index>1</index> 
        <text>Y24AUGXLOWS 2352159617737</text> 
    </item>
  </field>
  <field name="AP FAX">
    <item>
      <index>1</index> 
        <text>1 S1 SSRTKNETKHK1 2352159617737C1</text> 
    </item>
  </field>
这是我所说的部分xml的示例。例如,我想提取号码2352159617737


谢谢。

如果您想使用正则表达式,可以使用以下表达式:

[^\d](\d{13})[^\d]
\b(\d{13})\b
这个只抓取13个字符长的数字

用xml代码更新
缩短表达式

C4ud3x答案实际上是正确的,但我认为也可以这样做:[0-9]{13}

您也可以尝试此表达式:

[^\d](\d{13})[^\d]
\b(\d{13})\b
请注意,它将从xml中捕获所有13位文本,如果您特别想将其作为目标节点,也可以通过xpath查询。例如:


如果您只希望从标记中获取数字,而其他标记也可能包含类似的数字,但希望避免匹配它们,请使用带有XML解析器的正则表达式。以下是基于XElement的解决方案:

var xml = "<field name=\"TKT\"> - <item> <index>1</index> <text>Y24AUGXLOWS 2352159617737</text> </item> </field> - <field name=\"AP FAX\"> - <item> <index>1</index> <text>1 S1 SSRTKNETKHK1 2352159617737C1</text> </item> </field>";
var xe = XElement.Parse("<root>" + xml + "</root>");
var res = xe.Descendants("text").Select(p => p.Value).ToList();
var numbers = new List<string>();
foreach (var tag in res)
{ 
    numbers.AddRange(Regex.Matches(tag, @"(?<!\d)\d{12}(?!\d)").Cast<Match>().Select(n => n.Value).ToList());
}
对于任何处理数字提取的正则表达式,您应该了解其边界,并根据需要使用它:

\d{13}将获取13位数字序列,即使它们是较长数字序列的一部分。12345678901213456将为您提供1234567890123 ? 如果后面或前面没有数字,将得到所有13位序列。因此,A1234567890123B是有效匹配 \b\d{13}\b仅在包含非单词字符时匹配,1234567890123-like字符串是有效的匹配项。 @\d{13}?将为您提供13位数字:

XDocument doc = XDocument.Load(filePath);

var numbers = doc.Root.DescendantNodes().OfType<XText>()
                      .Where(t => Regex.IsMatch(t, @"\d{13}?"))
                      .Select(t => Regex.Match(t, @"\d{13}?").Value)
                      .ToList();

可以使用[^\d]\d{13}[^\d]正则表达式验证字符串。如果您想更改正则表达式中的字符串长度,那么只需将所需内容替换为13即可。您能提供一个xml示例吗?是你正在寻找的特定单词,还是有13个字符的元素?在c正则表达式指南上快速搜索,其中有一个查找数字字符串的示例。它是否太大而无法放入内存中?还是…?哈哈。那里的答案是如此之多。我不介意滥发我的解决方案。。。但是我不能理解这一点。@cagdasumay:一旦你发现你接受的解决方案不会给你带来任何结果,如果数字在字符串的开头,请回来选择正确的解决方案。好吗?如果这个数字不在标签内?我看不出问题中有任何条件,他只想在文本标签之间抓住@如果它解决了,那么考虑一下标记答案。否则,如果您确实需要文本标记过滤器,请告诉我。但是,这是一个错误的答案,因为它永远不会匹配字符串开头的数字。否定字符类与否定环视不同。请参阅我答案中的正则表达式以获得正确的解决方案。@Stribizev感谢您提供的信息!严重不知道这一点。@Stribizev:输入是xml,因此字符串不可能位于文件的开头或结尾。据我所知,它必须有某种封闭标记,这意味着在任何有效字符串之前和之后都会有内容。我同意这是一个重要的观点,尽管在所做的事情和负面观察之间存在差异。我主要是不同意这个答案是错误的说法——在这种特定的情况下,它会起作用的。它不能。他只想要13个字符长的字符串。这样,你也可以从字符串中抓取13个字符,例如20个字符,这不是他的目标。我知道,但是我没有看到他在哪里写错了,即使你不考虑解析XML,我的正则表达式也可以用纯文本输入作为var数=正则表达式。Matchestext,@?这似乎与一小时前C4ud3x的答案相同,似乎没有添加任何内容。。。