我需要一个正则表达式来匹配包含字符串的表达式,然后是一个可能的连字符,然后是零个或一个单词字符。在此之后,任何非单词字符都被接受,然后是任何内容。对于匹配的表达式,如果后面没有单词字符,则OK将更改为OK,如果后面的字母是A,则更改为OA。如果存在连字符,则删除。
OKAY => OK
OKAY- => OK
OKAYA => OA
OKAY-A => OA
OKAYAB => OKAYAB (no-match)
OKAY-AB => OKAY-AB (no-match)示例后面可以跟例如:.CD,但不更改结果
OKAY.CD => OK.CD
OKAY-.CD => OK.CD
OKAYA.CD => OA.CD
OKAY-A.CD => OA.CD
OKAYAB.CD => OKAYAB.CD (no-match)
OKAY-AB.CD => OKAY-AB.CD (no-match)我实现这个的问题是因为连字符和单词字符都是可选的,所以我得到了“惰性”匹配,它也匹配不需要的大小写。为了教育起见,我会喜欢有或没有看过的例子(如果可能)。
发布于 2012-05-24 02:40:00
下面是一个适用于您的正则表达式:
\bOKAY(?>-?)(\w)?([^\w\s]\S*)?(?!\S)由于不清楚您使用的是哪种语言,这里有一个伪代码,告诉您如何进行替换。
"O" + (match.group(1) if match.group(1) else "K") + match.group(2)这是一个小红宝石:http://www.rubular.com/r/SE8MBkUUUo
edit:我在注释之后对上面的正则表达式做了一些更改,但下面的描述并没有反映这些更改。以下是对原始regex的更改:
match
^更改为\b,因此它不需要在match
^是一个匹配,因此匹配将在<\b>d21[^\w\s] >,< OKAY OKAY >d22.* >结束时结束,< \S* >d22$ >的意思是“只有当我们在字符串末尾或下一个字符是空格时才匹配”,也可以写为(?=\s|\z)这里真正棘手的部分是,像^OKAY-?(\w)?(\W.*)?$这样的正则表达式看起来可以工作,但对于像OKAY-AB这样的情况却不是这样,因为最终-?和(\w)?都不匹配,然后(\W.*)?将匹配字符串的其余部分。
我们需要做的是修复它,这样-?就不会走回头路。如果.NET支持possessive quantifiers,那么这将很简单,然后我们可以将其更改为-?+。
不幸的是,它们不受支持,所以我们需要使用atomic grouping来代替。(?>-?)将可选地匹配-,但一旦它退出组,就会忘记所有回溯信息。请注意,原子组不捕获,因此(\w)?是捕获组1。
发布于 2012-05-24 02:18:36
要在不使用lookahead的情况下执行此操作,您可以使用
^(OKAY)(((-\w?|\w)(\W.*)?)|[^-\w].*)?$这与单词“or”匹配,然后是一个可选的组,它包含一个-、一个可选的单词字符,然后是一个可选的非单词字符,后面跟着anything组,或者一个字符不是-,或者是一个单词字符,后面跟着anything。^和$分别匹配字符串的开头和结尾,因此它只精确匹配可接受的字符串。
Lookahead几乎不会有什么不同。唯一的变化将是在"OKAY“组之后放置一个先行((?=...))。
要将其与.net一起使用,唯一需要的更改是转义字符串中的所有\。
发布于 2012-05-24 02:49:32
我不知道.NET正则表达式,但这是从preg风格匹配开始的:
OKAY-?(\w?)([^\w-]\w+)?\s*$
如果$1为空,则输出为OK$2
否则,输出为O$1$2。
https://stackoverflow.com/questions/10725579
复制相似问题