【发布时间】:2015-05-10 22:39:26
【问题描述】:
对于我公然缺乏正则表达式知识,我深表歉意,我知道这里会出现很多问题,但我可能会连续几个小时尝试,但我无法弄清楚这一点。 基本上我要做的是替换字符串中所有出现的 6 位数字(带或不带连字符)。但是,如果前面有某些单词,我不希望替换数字。
这个Regular expression to match a line that doesn't contain a word? 解决方案接近我正在寻找的,但我似乎无法以适合我要求的方式使用它。
我需要如下: 对于字符串:
“用户于 2014 年 5 月 23 日向账户 123456 支付了 43 英镑,支票 123456 交易:123456。”
我只想替换前面没有“支票”或“交易:”的 6 位数字。我一直在尝试如下:
\b[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b
(这将替换所有 6 位数字)
使用这个How do you replace a match, using regex, only if it is not preceded by a given character? 答案,我试过了
(^cheque\s[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b)
(请注意,我首先尝试使用我希望转义的单词之一,然后再包含其他单词。) 这不会替换任何 6 位数字。
经过反复试验,我发现了
(cheque\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b)
将替换单词 check 后跟一个 6 位数字,所以我到了那里 - 但我需要否定这个(交易后跟 6 位数字)并替换为 6 位数字 不是前面有这些词。
这个How to negate the whole regex? 答案有助于弄清楚如何否定表达式,但尽我所能,我找不到如何让它适合我的情况。我试过了
^(?!(?:((transaction\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) )|((cheque\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) ))$).*$
但这替换了整个字符串!
非常感谢您对此的任何帮助。
谢谢你。
【问题讨论】:
-
请澄清。您使用什么语言?此外,如果您正在运行标准的“全部替换”,则不能不替换某些匹配项。您可以将正则表达式更改为根本不匹配它们(满足要求)或迭代匹配并使用进一步的代码检查它们。匹配它们是否足以满足您的需求?
-
只有在你的正则表达式引擎支持negative look-behinds时才能这样做。
-
感谢您的快速回复!我正在使用 c#,但我坚持使用 Visual Studio 2005。
-
我需要替换那些没有'check'的
标签: regex