-1

我正在努力赶上正则表达式,我做了一个如下;

^(.){1};(\d){4};(\d){8};[A,K]{1};(\d){7,8};(\d){8};[A-Z ]{1,};[ ,\d]{1};(\d){8};(\d){1};(\d){1}; $

样本是;

ä;1234;00126434;K;11821111;00000000;SOME TEXT ; 0;00000000;0;0;

据我所读

. 是所有字符,\d是数字,{n}和变体表示n次,并且根据变体,更多的重复。

可能是什么问题呢?

4

4 回答 4

3

一些建议/意见:

  • 您可以删除所有{1}s,它们什么都不做。
  • [A,K]意思是“ A,K”。如果要匹配 and 之间的任何字母A,请K使用[A-K].
  • 您应该将捕获组放在重复周围:(\d{7,8})捕获一个 7-8 位数字;(\d){7,8}只会捕获最后一个数字。
  • [ ,\d]{1}0正则表达式失败,因为字符串中的那个点有两个字符(空格和)。
  • 您可能需要删除 final 之前的空格$,除非在最后一个分号之后的字符串中确实有空格。

这是一个匹配的版本(并在单独的组中捕获每个元素):

^(.);(\d{4});(\d{8});([A-K]);(\d{7,8});(\d{8});([A-Z ]+);([ ,\d]+);(\d{8});(\d);(\d); *$

在 regex101.com 上查看它的实际应用。

于 2013-06-18T08:47:00.360 回答
2

不要滥用正则表达式

您的格式是 CSV 格式,只需拆分;并正确验证各个部分。这是完全有效的,通常同样有效,并且更易于调试。

使用正则表达式,确保您正确转义(即双重转义!)。在大多数编程语言中,\是字符串中的保留字符,您需要使用\\它才能获得所需的效果。

于 2013-06-18T11:36:37.950 回答
1

试试这个:

^(.){1};(\d){4};(\d){8};[A-K]{1};(\d){7,8};(\d){8};[A-Z ]{1,};[ \d]{2};(\d){8};(\d){1};(\d){1};$

这是您的正则表达式中发生的事情 ^(.){1};(\d){4};(\d){8};[A,K]{1};(\d){7,8};(\d){8};[A-Z ]{1,};[ ,\d]{1};(\d){8};(\d){1};(\d){1}; $

  • 你在最后之前有额外的空间$
  • 要指定范围使用-而不是逗号,您的范围应该是[A-K].
  • [ ,\d]范围内您已将其限制为 1 个字符{1},它应该是{2}1 个空格和 1 个数字。

附加:您不需要指定{1},因为默认情况下它将匹配前面的一个标记

于 2013-06-18T08:45:13.253 回答
0

如果你的不起作用,你可以试试这个:

^(.){1};(\d){4};(\d){8};[A,K]{1};(\d){7,8};(\d){8};[A-Z ]{1,};( \d){1};(\d){8};(\d){1};(\d){1};$ 
于 2013-06-18T08:45:43.480 回答