【问题标题】:RegEX string to specific lengthsRegEX 字符串到特定长度
【发布时间】:2015-02-09 18:00:21
【问题描述】:

大家好,我在 RegEX 上很糟糕,所以我发布这个问题,希望 RegEX Guru 能够轻松知道并分享答案。

我有以下字符串类型:

508815  AYBK1619RAUEZP
AWBZ4222TYBE1207CWSWER
DEFAULT EP1     O25R60

我需要这种格式(拆分):

508815   AYBK1619  RAU EZP
AWBZ4222 TYBE1207  CWS WER
DEFAULT  EP1       O25 R60

所以: xxxxxxxx xxxxxxxx xxx xxx

  • 字符串的前 8 个字符
  • 字符串中接下来的 8 个字符
  • 字符串中接下来的 3 个字符
  • 字符串的最后 3 个字符

我可以做 Mid(x,x) 和所有的事情,但我认为使用 RegEX 会更快更清晰的代码。

任何帮助都会很棒!谢谢!

【问题讨论】:

  • 如果你不能写正则表达式,那么它就不是更干净的代码。坚持自己容易理解的,以后不会头疼的。
  • @RyanJ 检查更新的 OP。
  • 我不会使用正则表达式,我会使用子字符串
  • 你有没有做过任何测试,现在你有一个正则表达式,以确定哪种方式最快,因为你似乎有一个标准?
  • RegEX 更快 - 放下手。

标签: regex vb.net parsing split


【解决方案1】:

如果您希望实际使用正则表达式在这些位置进行拆分,您可以使用以下内容:

Dim s As String = "508815  AYBK1619RAUEZP"
Dim m() As String = Regex.Split(s, "(?<=^.{8})|(?<=^.{16})|(?<=^.{19})")
Console.WriteLine(String.Join(" ", m)) '=> "508815   AYBK1619 RAU EZP"

您也可以只匹配这些位置的子字符串,而不是splitting ...

Dim s As String = "AWBZ4222TYBE1207CWSWER"
Dim m As Match = Regex.Match(s, "^(.{8})(.{8})(.{3})(.{3})$")
If m.Success Then
   Console.WriteLine(
          String.Join(" ", 
                      m.Groups(1).Value,
                      m.Groups(2).Value,
                      m.Groups(3).Value,
                      m.Groups(4).Value
                     ))
End If

'**Output => "AWBZ4222 TYBE1207 CWS WER"

【讨论】:

  • 这也是另一种方式,因此也感谢您发布该内容,hwnd!
【解决方案2】:

您可以使用以下正则表达式来获得所需的内容:

^(\w{0,8})\s*(\w+)\s*(\w{3})(\w{3})$

这个正则表达式将:

  1. 匹配字符串开头的 0 到 8 个单词字符
  2. 后跟 0 个或多个空格
  3. 后跟 1 个或多个单词字符
  4. 后跟 0 个或多个空格
  5. 后跟 3 个单词字符
  6. 后跟 3 个单词字符
  7. 字符串结束

单词字符 (\w) 是任何字母数字字符,加上下划线字符。例如,如果您只需要大写字母,则可以将 \w 替换为 A-Z 字符类(A-Z 范围内的任何字母),使用 [A-Z]

See example

【讨论】:

  • 检查我更新的 OP... 做了一些可能对 RegEX 很重要的补充。
  • for DEFAULT EP1 O25R60 我在您的示例中对其进行了测试,它告诉我 您的模式与主题字符串不匹配。
猜你喜欢
  • 2017-12-26
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多