首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含可能的连字符,然后是有限数量的单词字符的正则表达式

包含可能的连字符,然后是有限数量的单词字符的正则表达式
EN

Stack Overflow用户
提问于 2012-05-24 02:14:06
回答 3查看 173关注 0票数 0

我需要一个正则表达式来匹配包含字符串的表达式,然后是一个可能的连字符,然后是零个或一个单词字符。在此之后,任何非单词字符都被接受,然后是任何内容。对于匹配的表达式,如果后面没有单词字符,则OK将更改为OK,如果后面的字母是A,则更改为OA。如果存在连字符,则删除。

代码语言:javascript
复制
OKAY         =>       OK
OKAY-        =>       OK
OKAYA        =>       OA
OKAY-A       =>       OA
OKAYAB       =>       OKAYAB          (no-match)
OKAY-AB      =>       OKAY-AB         (no-match)

示例后面可以跟例如:.CD,但不更改结果

代码语言:javascript
复制
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)

我实现这个的问题是因为连字符和单词字符都是可选的,所以我得到了“惰性”匹配,它也匹配不需要的大小写。为了教育起见,我会喜欢有或没有看过的例子(如果可能)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-24 02:40:00

下面是一个适用于您的正则表达式:

代码语言:javascript
复制
\bOKAY(?>-?)(\w)?([^\w\s]\S*)?(?!\S)

由于不清楚您使用的是哪种语言,这里有一个伪代码,告诉您如何进行替换。

代码语言:javascript
复制
"O" + (match.group(1) if match.group(1) else "K") + match.group(2)

这是一个小红宝石:http://www.rubular.com/r/SE8MBkUUUo

edit:我在注释之后对上面的正则表达式做了一些更改,但下面的描述并没有反映这些更改。以下是对原始regex的更改:

match

  • Changed

  • ^更改为\b,因此它不需要在match

  • Changed

  • 的开头开始成为空格,这防止了^是一个匹配,因此匹配将在<\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。

票数 2
EN

Stack Overflow用户

发布于 2012-05-24 02:18:36

要在不使用lookahead的情况下执行此操作,您可以使用

代码语言:javascript
复制
^(OKAY)(((-\w?|\w)(\W.*)?)|[^-\w].*)?$

这与单词“or”匹配,然后是一个可选的组,它包含一个-、一个可选的单词字符,然后是一个可选的非单词字符,后面跟着anything组,或者一个字符不是-,或者是一个单词字符,后面跟着anything。^$分别匹配字符串的开头和结尾,因此它只精确匹配可接受的字符串。

Lookahead几乎不会有什么不同。唯一的变化将是在"OKAY“组之后放置一个先行((?=...))。

要将其与.net一起使用,唯一需要的更改是转义字符串中的所有\

票数 1
EN

Stack Overflow用户

发布于 2012-05-24 02:49:32

我不知道.NET正则表达式,但这是从preg风格匹配开始的:

OKAY-?(\w?)([^\w-]\w+)?\s*$

如果$1为空,则输出为OK$2

否则,输出为O$1$2。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10725579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档