除了以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
答案 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答案的扩展,以确保它是一个数字。