【发布时间】:2017-12-02 10:23:48
【问题描述】:
一般问题
我试图了解在编写正则表达式时如何防止在寻找的模式之前或之后存在某些模式!
一个更具体的例子
我正在寻找一个正则表达式,它将匹配长字符串中格式为 YYMMDD ((([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1]))) 的日期,同时忽略较长的数字序列
应该可以匹配:
- text151124moretext
- 123text151124moretext
- 文本151124
- text151124moretext1944
- 151124
但应该忽略:
- 文本15112412更多文本 (原因:它有 8 个数字而不是 6 个)
- 151324 (原因:YYMMDD 不是有效日期 - 没有第 13 个月)
我如何确保如果一个数字的 更多 超过这 6 位数字,它不会在单个正则表达式中作为日期被拾取(意思是,我宁愿避免预处理字符串)
我想到了\D((19|20)([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1]))\D,但这是否意味着必须前后有一些角色?
我正在使用 bash 3.2 (ERE)
谢谢!
【问题讨论】:
-
如果你使用
(^|[^0-9])....([^0-9]|$)? -
什么没有断言?
-
没有
bash3.4;你是说 OS X 自带的 3.2,还是你自己安装的 4.3? -
@chepner,啊,我的错误——OSX 自带的是 3.2!感谢您指出!
-
@sin,这是一个很好的收获!所有这些正则表达式的味道都让我头疼,作为一个初学者,这真的很令人生畏——看来我确实需要的是消极的前瞻。似乎 ERE 不支持负前瞻 - 不是吗?