从ant中,我们希望从旧的/etc/shadow文件中提取一行,捕获特定用户名的行,例如"manager"。这是备份/恢复操作的一部分。我们以前使用的内容不够具体,所以它会与"mymanager"等用户相匹配,所以我们试图通过将字符串的开头锚定到行的开头(通常为"^")来收紧它这肯定没有像我们预期的那样奏效
我们如何锚定以便获得用户名的精确匹配?--回答如下
第一次尝试,如果/etc/shadow文件副本中有"mymanager"的用户,则会给出错误的结果:
<loadfile property="oldPasswords" srcFile="${backup.dir}/shadow"/>
<propertyregex property="manager.backup" input="${oldPasswords}"
regexp="(manager:.*)" select="1" casesensitive="true" />
第二次尝试失败,因为默认情况下"^"不是以正常的正则表达式方式解释的:
<loadfile property="oldPasswords" srcFile="${backup.dir}/shadow"/>
<propertyregex property="manager.backup" input="${oldPasswords}"
regexp="^(manager:.*)" select="1" casesensitive="true" />
Kobi建议添加->flags="m"<-这听起来不错,但ant报告称propertygex不支持flags选项。
最后一个成功的方法需要在regexp的开头插入"(?m)":这是一个重要的更改。
<propertyregex property="manager.backup" input="${oldPasswords}"
regexp="(?m)^manager:.*$" select=" " casesensitive="true" />
带有propertyregex的regexp似乎遵循Java中正则表达式文档中的规则(例如搜索"multiline"):http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
如果您对如何使propertyregex和regexp执行您希望它们执行的操作有类似的问题,请查看上面的文档!
谢谢!已解决。
Alan Carwile
我认为m(ultiline)标志是您想要使用的,它将为线锚的开始提供正确的行为。可以使用语法(?<flagstoturnon>-<flagstoturnoff>)
更改正则表达式中的标志。因此,在您的情况下,将(?m)
添加到正则表达式的开头(插入符号之前)应该可以。