0

我正在寻找一个非常具体的正则表达式,它将帮助我找到符合以下规则的字符串:

  1. 字符串必须包含关键字“Year”或“YEAR”
  2. 关键字需要通过非字母与其他文本分开,或者关键字在字符串中全部大写或首字母大写,否则混合大小写。
  3. 关键字必须位于字符串的开头或结尾。

例如,我希望正则表达式匹配以下字符串:

Order YEAR
OrderYear
Order_YEAR
ORDER_YEAR
order year 
YEAR_Order
YearOrder

但不是这些:

orderyear
ORDERYEAR
yearning
Order_Year_Test

到目前为止,我唯一能想到的是:

^YEAR|YEAR$|^Year|Year$

这适用于大多数事情,但对于“订单年份”和“订单年份”示例返回相反的输出。我需要某种表达大小写规则的正则表达式。

具体来说,我正在使用 ICU 的正则表达式库(但只是一般的正则表达式建议就可以了)。

谢谢你的帮助,

4

1 回答 1

1

描述

该表达式将:

  • 匹配您的所有示例案例,同时避免不希望的案例
  • 符合 java 正则表达式引擎

请注意,这确实使用了x忽略表达式中的空格和注释的选项

(?:^|\s)(?:Year|YEAR)(?:\s|\Z|$)  # match no prefix or suffix
|
(?:^|\s)[A-Z][a-z]+[^a-zA-Z\d]?(?:Year|YEAR)(?:\s|\Z|$) # match title case prefix
|
(?:^|\s)[A-Z]+[^a-zA-Z\d\s](?:Year|YEAR)(?:\s|\Z|$)  # match all uppercase prefix
|
(?:^|\s)[a-z]+[^a-zA-Z\d](?:year)(?:\s|\Z|$)  # match all lower case prefix and keyword

|
(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d]?[A-Z][a-z]+(?:\s|\Z|$) # match title case suffix
|
(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d\s][A-Z]+(?:\s|\Z|$)  # match all uppercase suffix

或作为单个字符串: (?:^|\s)(?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[A-Z][a-z]+[^a-zA-Z\d]?(?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[A-Z]+[^a-zA-Z\d\s](?:Year|YEAR)(?:\s|\Z|$)|(?:^|\s)[a-z]+[^a-zA-Z\d](?:year)(?:\s|\Z|$)|(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d]?[A-Z][a-z]+(?:\s|\Z|$)|(?:^|\s)(?:Year|YEAR)[^a-zA-Z\d\s][A-Z]+(?:\s|\Z|$)

例子

现场示例:http ://www.rubular.com/r/QTUNDPKuOL

示例文本

Order YEAR
OrderYear
Order_YEAR
ORDER_YEAR
order year 
YEAR_Order
YearOrder
But not these:

orderyear
ORDERYEAR
yearning
Order_Year_Test

匹配上

[0] => Order YEAR
[1] => 
OrderYear
[2] => 
Order_YEAR
[3] => 
ORDER_YEAR
[4] => 
order year 
[5] => 
YEAR_Order
[6] => 
YearOrder
于 2013-07-12T23:50:40.343 回答