【问题标题】:Regex pattern to match many combinations for a camel case string正则表达式模式匹配驼峰式字符串的许多组合
【发布时间】:2017-07-26 15:58:54
【问题描述】:

我正在尝试创建一个正则表达式模式(一个或多个)。例如有SomeCamelStringToCombine 它应该匹配以下子字符串:

Some, Camel, String, To, Combine, SomeCamel, SomeCamelString,SomeCamelStringTo, SomeCamelStringToCombine, CamelString, CamelStringTo, CamelStringToCombine, StringTo, StringToCombine, ToCombine.

我设法创建了这个模式:/(?=([\p{Lu}]+[\p{L}]+))/,但它匹配

SomeCamelStringToCombine, CamelStringToCombine, StringToCombine, ToCombine, Combine.

我不知道我应该修改它还是创建额外的模式。问题是我不知道怎么做。我正在使用 Java 进行匹配。

我可以向您寻求帮助或提示吗?

【问题讨论】:

  • @Arpit:我不这么认为,请仔细阅读问题。
  • 我会在这里冒昧地说你不能用 just 一个正则表达式来做到这一点。但是一个正则表达式识别与循环组合以(重新)创建组合的片段应该足够简单。
  • @T.J.Crowder 为不正确的评论道歉。我支持你,正则表达式不是这样做的方式。也许拆分字符串并与字符串数组匹配。
  • 这在正则表达式中会很昂贵,我保证你想出的任何正则表达式都会在某种程度上是错误的。最好只创建字符串中大写字母的索引列表,在列表上进行嵌套循环,然后从中获取所有有效的子字符串。做起来容易得多,犯错的工作也少得多。

标签: java regex pattern-matching camelcasing


【解决方案1】:

您可以创建一个固定大小的正则表达式来查找最多这么多单词组合。
下面使用 5 个单词的捕获量,但您可以将其扩展到任何大小。

您可以轻松地以编程方式创建正则表达式。

只需从数组中排除 empty 捕获组。

注意,第一次匹配后,也可以排除1-5组来避免
重复单曲。

(?=([A-Z][a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)?([A-Z][a-z]+)?([A-Z][a-z]+)?)(?=(\1\2))(?=(\6\3)?)(?=(\7\4)?)(?=(\8\5)?)\1

https://regex101.com/r/ta9Qzq/1

 (?=
      ( [A-Z] [a-z]+ )              # (1), required Word 1
      ( [A-Z] [a-z]+ )              # (2), required Word 2
      ( [A-Z] [a-z]+ )?             # (3), optional Word 3
      ( [A-Z] [a-z]+ )?             # (4), optional Word 4
      ( [A-Z] [a-z]+ )?             # (5), optional Word 5
 )
 (?=
      ( \1 \2 )                     # (6), required Word 1,2
 )
 (?=
      ( \6 \3 )?                    # (7), optional Word 1,2,3
 )
 (?=
      ( \7 \4 )?                    # (8), optional Word 1,2,3,4
 )
 (?=
      ( \8 \5 )?                    # (9), optional Word 1,2,3,4,5
 )
 \1                            # Advance position by 1 word

【讨论】:

  • 这是如何回答“例如拥有SomeCamelStringToCombine 它应该匹配例如CamelString,而不是SomeString”?
  • @Andreas - 在全局匹配中,它产生数组Some, Camel, String, To, Combine, SomeCamel, SomeCamelString,SomeCamelStringTo, SomeCamelStringToCombine, CamelString, CamelStringTo, CamelStringToCombine, StringTo, StringToCombine, ToCombine _有什么问题? regex101.com/r/ta9Qzq/1
  • 猜我没听懂这个问题。仍然不确定我是否这样做。但是,您说“它产生数组”,但它没有。至少不是没有额外的 Java 代码来组合来自重复的find() 调用的所有各种捕获的组。您还说“您可以将其扩展到任何大小”,但这并不完全正确,因为您可以将其扩展到任何 特定 最大大小,但不支持任何(无限制)大小。
  • @Andreas - 不,我还不会把它写成代码,对吗?至于扩展大小,它受到 Java 支持的捕获组数量的限制。我猜如果它支持 25,000,你最终会得到一个 2-3 MB 的正则表达式。
  • @Andreas - 哦,这里还有某种 n 阶乘运算。很难想象无限大小。
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2013-06-26
  • 2015-11-14
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多