正则表达式返回C#“111; 222; 3333”和“213”中包含alpha的字符串中的所有整数

时间:2016-06-22 14:02:35

标签: c# .net regex

我正在提取xml文件中使用的所有数字。这些数字用以下两种模式写成

<Environment Id="11" StringId="8407" DescriptionId="5014" RemoteControlAppStringId="8119; 8118" EnvironmentType="BlueToothBridge" AlternateId="1" XML_NAME_ID="BTBSpeechPlusM" FactoryGainType="LIN18">
  <Offsets />
</Environment>

我正在使用正则表达式:“\”\ d *; \“”和“\”\ d * \“”来提取所有数字。 从上面我使用

运行正则表达式“\”\ d * \“”
Regex.Match(myString, "\"\\d*\"")

以上行返回8407,11,5014,但未返回8119和8118

3 个答案:

答案 0 :(得分:3)

你的正则表达式将无法匹配8119; 8118因为您的模式正在查找带引号的数字。 试试

\b\d+\b

\ b指定\ d +仅匹配单词边界。所以LIN 18 将不匹配。

答案 1 :(得分:1)

取决于您是否可以假设提供的输入是有效的XML,您可以使用以下正则表达式:1

Regex.match(myString, "(?<=\")\\d+(?=\")|(?<=\")\\d+(?=; ?\\d+\")|(?<=\"\\d+; ?)\\d+(?=\")" )

这背后的主要思想是考虑到三种可能的情况:

  • &#34; [数字]&#34;
  • &#34; [数]; [other_number]&#34; (在[other_number]之前有或没有空格)
  • &#34; [other_number]; [数字]&#34; (在[数字]之前有或没有空格)

我在正则表达式中包含两个新概念:2

  • 积极向前看:(?= [regex])
  • 正面观察:(?&lt; = [regex])

这些概念允许正则表达式检查特定内容是否在其之前或之后,而不是将其放入匹配中。

这个正则表达式可以很容易地进行优化,但这是一个基本方法的例子。

开发这样的正则表达式的一个好方法是使用工具(在线或离线)来测试正则表达式。我使用的工具是.NET Regex Tester

答案 2 :(得分:0)

正如@poke在评论中所述,这是因为你的正则表达式与字符串不匹配。更改正则表达式以捕获特定匹配项并考虑&#39 ;;&#39;。

的可能性。

下面的内容应该可以解决问题。

编辑:(\b\d+\b)|(\b\d+[;*]\d+\b)

Regex Results