正则表达式可以实现吗?

时间:2013-10-28 18:25:41

标签: c# regex

我正在解析一个我想要提取某个字符串的文件。

字符串前面会有一些长度的空格,后面跟着:

  • 一个H后跟8个十六进制数字

  • a G后跟9个十六进制数字

然后是回车和换行符。

我是否可以制作一个等同于“如果字符是H,然后跳过8个字符的表达式,否则如果字符是G则跳过9个字符”或者甚至更简单地“如果字符是H,跳过8个字符,否则跳过9个字符“。

目前使用H的正则表达式是 @“\ s + H。{8}(?<user>。*)\ r \ n”,但是我在添加条件字符计数时,我很难过。例如,如果有一些像[H | G]。{8 | 9}这样的语法,那真的很好,但我不认为这实际上存在于正则表达式语法中。

4 个答案:

答案 0 :(得分:4)

根据我的评论,我只是详细阐述了你的评论

\s+((H.{8})|(G.{9}))(?<user>.*)\r\n

Regular expression visualization

Debuggex Demo

由于正则表达式对应于Finte State Automata,因此很容易理解为什么这是微不足道的,在读取H时我们进入一个状态,G进入另一个状态。

答案 1 :(得分:2)

我会用:

\s+(?:H[a-fA-F0-9]{8}|G[a-fA-F0-9]{9})(?<user>.*)\r\n

答案 2 :(得分:1)

有可能Regex。您可以在正则表达式中使用条件。

这是你正在努力的“正则表达式”的主要部分。我假设你可以用这个构建。

var subject = "H12345678ABC";
var regex = new Regex(@"(?((?<hgroup>H))\k<hgroup>.{8}|.{10})(?<user>.*)");
var match =regex.Match(subject);
if(match.Success)
{
    Console.WriteLine(match.Groups["user"].Value);//prints ABC
}
else
{
    Console.WriteLine("No Match");
}

分手:

(?<hgroup>H)    Matches H and stores in group hgroup
\k<hgroup>.{8}  If true checks matches H followed by any 8 characters
.{10}           If not then match next 10 characters(G followed by 9 other characters)
(?<user>.*)     Captures rest all to user group

这是一个有效的Demo

答案 3 :(得分:0)

如果有条件,这会有两个。使用正则表达式选项IgnorePatternWhitespace来允许注释

(?(H0[xX][0-9a-fA-F]{6}[^\r\n\d]+)     # If an H with 8 hex digits is found
     H.{8}(?<User>[^\r\n\d]+)          # Then match the H user
    |                                  # else
    (?(G0[xX][0-9a-fA-F]{7}[^\r\n\d]+) # If G with 9 hex is found
      G.{9}(?<User>[^\r\n\d]+))        # Then match the G User
 )

更新

阿基里斯痊愈的是,目前还不清楚用户名是什么......如果用户名有一个数字说1OmegaMan ...这将失败。但是OP没有指定该规则,也没有给出任何 clear 示例。

所以这里假设用户名是所有字母字符。

一个更好的搜索模式可能是H\d{8}[A-Z][^\r\n]+,它表示在数字后面至少有一个字母字符,用数字表示用户名。