匹配号码以1结尾,但以11

时间:2018-06-06 08:27:36

标签: regex awk

除了以11结尾的数字之外,我需要匹配以1结尾的任何数字。我使用awk。为了说明,正确的工作线是:

if ( max ~ /1$/ && max !~ /11$/ ) { print max }

或使用正则表达式:

if ( max ~ /[^1]1$|^1$/ ) { print max }

或相同正则表达式的慢得多的变体:

([^1]|^)1$

我实际上怀疑这一部分(带有修改)应该以某种方式工作。它很好,简短易读,比上面的组合步骤少得多,适用于2位数以上的所有数字,但1本身就失败了。我在上面修正了,但更喜欢更好的(如果有的话)。我实际上需要它来处理1到3位数字,但更愿意不限制它。

[^1]1$

当我尝试使用quantfers来修复它时,它无法正常工作。它要么开始挑选前导1(例如1211匹配而不应该),要么松散单个数字1作为匹配。显然,我的问题在于我必须匹配数字的结尾。如何制作更好的正则表达式?

测试用例: 匹配数字是:
1
21个
31个
121个
131个
1021

跳过(不匹配)以11结尾的数字,如:
11个
111个
211个
1011
1211

2 个答案:

答案 0 :(得分:1)

如果您的Input_file与显示的示例相同,那么关注awk可能会对您有帮助。

awk  '/[02-9]1$/||/^1$/' Input_file

假设以下是示例Input_file。

cat Input_file
1
2001
21
31
121
131
1021
11
111
211
1011
1211

然后在运行代码后输出以下内容。

awk  '/[02-9]1$/||/^1$/'  Input_file
1
2001
21
31
121
131
1021

答案 1 :(得分:1)

你不能这样做,我相信它比正则表达式解析更快:

如果您知道max是一个数字:

if ( max%10 == 1 && max%100 != 11 ) { print max }

如果你不知道max是一个数字:

if ( max+0==max && max%10 == 1 && max%100 != 11 ) { print max }

如果你想要一个正则表达式,你可以使用^[0-9]*[02-9]1$|^1$,但这只是RavinderSingh13答案的扩展,以确保它是一个数字。