Regex Can';扩展正则表达式时找不到与grep匹配的

Regex Can';扩展正则表达式时找不到与grep匹配的,regex,bash,unix,Regex,Bash,Unix,(免责声明:这是一个家庭作业练习) 我有一个档案,里面有几个登记簿,每个都有一个信用卡号。我必须检索属于美国运通卡的寄存器,这些寄存器以34、35或36开头,总共有15位数字,如下所示: XXXX-XXXX-XXXX-XXX 每4位用连字符分隔 我试着在那个文件上使用grep来检测那个些数字,但没用。这是我使用的原始命令: grep -E "[34-36][0-9]{2}[\-]([0-9]{4}[\-]){2}[0-9]{3}" MYFILE.txt 我认为它会起作用,因为我认为正则表达式的

(免责声明:这是一个家庭作业练习)

我有一个档案,里面有几个登记簿,每个都有一个信用卡号。我必须检索属于美国运通卡的寄存器,这些寄存器以34、35或36开头,总共有15位数字,如下所示:

XXXX-XXXX-XXXX-XXX

每4位用连字符分隔

我试着在那个文件上使用grep来检测那个些数字,但没用。这是我使用的原始命令:

grep -E "[34-36][0-9]{2}[\-]([0-9]{4}[\-]){2}[0-9]{3}" MYFILE.txt
我认为它会起作用,因为我认为正则表达式的意思是:

“一个介于34和36之间的数字,后跟2个从0到9的数字,后跟一个连字符,后跟4个从0到9的数字,后跟一个连字符(这两次),后跟3个从0到9的数字。”

但是这个命令什么也没有得到。为了记录在案,我有这个登记册:

3435-9999-8765-333

在文件中,所以我至少应该检索它

有趣的是,如果我把正则表达式改成只
[34-36][0-9]{2}
,我会得到一个匹配(很明显),如果我加上连字符(
[34-36][0-9]{2}[\-]
),我仍然会得到一个匹配,但是如果我在它后面添加任何东西(比如
[34-36][0-9]{2}[-[0-9]
[34-36][0-9]{2}-]a
将记录更改为在前两位数字后加上“a”)时,我停止检索任何内容

我做错了什么?正则表达式中的连字符有问题吗?哪一个是正确的


谢谢。

请尝试以下正则表达式:

[3][4-6][0-9]{2}-([0-9]{4}-){2}[0-9]{3}

请尝试以下正则表达式:

[3][4-6][0-9]{2}-([0-9]{4}-){2}[0-9]{3}

请尝试以下正则表达式:

[3][4-6][0-9]{2}-([0-9]{4}-){2}[0-9]{3}

请尝试以下正则表达式:

[3][4-6][0-9]{2}-([0-9]{4}-){2}[0-9]{3}

您应该使用扬抑符将表达式锚定在行的开头。(如果您的行以卡号开头,则从表达式中删除
^
)字符类中不需要转义连字符(例如
[\-]
应为
[-]
。使用该选项,请尝试:

grep -E "^3[4-6][0-9]{2}[-]([0-9]{4}[-]){2}[0-9]{3}" MYFILE.txt

应使用扬抑符号将表达式锚定在行的开头(如果行以卡号开头,则从表达式中删除
^
),无需在字符类中转义连字符(例如
[\-]
应为
[-]
。这样,请尝试:

grep -E "^3[4-6][0-9]{2}[-]([0-9]{4}[-]){2}[0-9]{3}" MYFILE.txt

应使用扬抑符号将表达式锚定在行的开头(如果行以卡号开头,则从表达式中删除
^
),无需在字符类中转义连字符(例如
[\-]
应为
[-]
。这样,请尝试:

grep -E "^3[4-6][0-9]{2}[-]([0-9]{4}[-]){2}[0-9]{3}" MYFILE.txt

应使用扬抑符号将表达式锚定在行的开头(如果行以卡号开头,则从表达式中删除
^
),无需在字符类中转义连字符(例如
[\-]
应为
[-]
。这样,请尝试:

grep -E "^3[4-6][0-9]{2}[-]([0-9]{4}[-]){2}[0-9]{3}" MYFILE.txt

我不认为
[34-36]
是正确的,我认为你需要
(34 | 35 | 36)
。我不经常使用字符类;但我认为如果它是一个范围,例如
a-z
0-9
,或一个字符列表,它们是单个字符对另一个单个字符。这里有一个线程。或者
3[4-6][0-9]..
回想一下,
[…]
中的任何字符(数字)列表或范围占据一个输入位置。祝您好运。
[34-36]
表示(3,4到3之间的任何数字,以及6)中的任意一个.Regex的味道通常会在范围上出现问题,尽管
4-3
。虽然这里很简单,因为您只需要三个数字,但在Regex中匹配一个范围的数字可能会非常混乱。我认为
[34-36]
是不对的,我认为您需要
(34 | 35 | 36)
。我不经常使用字符类;但如果是一个范围,例如
a-z
0-9
,或字符列表,我认为它们是单个字符对另一个单个字符的转换。这里有一个线程。或
3[4-6][0-9]。
回想一下
[…]中的任何字符(数字)列表或范围
选择一个输入位置。祝你好运。
[34-36]
表示(3,4到3之间的任何数字,以及6)中的任何一个。尽管
4-3
,正则表达式的味道通常会在顺序上出现问题。虽然这里很简单,因为你只需要三个数字,但在正则表达式中匹配一个数字范围可能会变得非常混乱。我不认为
[34-36]
是正确的,我认为您需要
(34 | 35 | 36)
。我不经常使用字符类;但我认为如果是一个范围,则它们是单个字符到另一个单个字符,例如
a-z
0-9
,或字符列表。这里有一个线程。或
3[4-6][0-9]..
回想一下,
[…]
中的任何字符(数字)列表或范围占据一个输入位置。祝您好运。
[34-36]
表示(3,4到3之间的任何数字,以及6)中的任意一个.Regex的味道通常会在范围上出现问题,尽管
4-3
。虽然这里很简单,因为您只需要三个数字,但在Regex中匹配一个范围的数字可能会非常混乱。我认为
[34-36]
是不对的,我认为您需要
(34 | 35 | 36)
。我不经常使用字符类;但如果是一个范围,例如
a-z
0-9
,或字符列表,我认为它们是单个字符对另一个单个字符的转换。这里有一个线程。或
3[4-6][0-9]。
回想一下
[…]中的任何字符(数字)列表或范围
选择一个输入位置。祝你好运。
[34-36]
表示(3,4到3之间的任何数字,以及6)中的任何一个。尽管
4-3
,但正则表达式的味道通常会在顺序上出现问题。虽然这里很简单,因为你只需要三个数字,但在正则表达式中匹配一个数字范围可能会非常混乱。