【问题标题】:Regex to find common letters between two strings正则表达式查找两个字符串之间的共同字母
【发布时间】:2013-01-02 23:53:18
【问题描述】:

我在 Google 上搜索了几个小时,得到了部分解决方案。

我是 Groovy 和正则表达式的新手。这些年来我偶尔使用过正则表达式,但我对它很不适应。

我有一个简单的游戏,可以检查你与隐藏单词有多少共同字母。

为简单起见,假设单词是“pan”,而人键入“can”。

我希望正则表达式的结果给我“an”。

现在,我通过这样做(在 Groovy 中)部分工作:

// Where "guess" is the user's try and "word" is the word they need to guess.
def expr = "[$word]"
def result = guess.find(expr)

结果字符串只包含第一个匹配的字母。有人有更优雅的解决方案吗? 提前致谢

【问题讨论】:

  • 这看起来不是正则表达式的好用例。
  • 你对“有共同字母”的定义是什么?它们是否需要在同一个位置或单词中的任何位置?它们必须按正确的顺序排列吗?
  • @RobertB:当我重读这个问题时,它似乎不是最长的常见子字符串问题。
  • 如果这个词是banana,他们猜是can?

标签: regex groovy


【解决方案1】:

我认为这不是正则表达式的用例。如果用户输入.* 等,您必须注意不让用户自动猜测。

典型的收集工作更适合 IMO 的这项任务。一种解决方案是找到两个单词的交集,将它们视为字符集:

(word as Set).intersect(guess as Set).join()

或过滤出现在密语中的猜测字符:

guess.findAll { word.contains(it) }.unique().join()

【讨论】:

  • 感谢@epidemian,仍在学习 Groovy,但这看起来很酷。
【解决方案2】:

假设这两个字符串是 s1 和 s2 现在找到常见的字符串:

commonString=s1.replaceAll("[^"+s2+"]","");

如果您的单词包含元字符,那么 先做:

Pattern.quote(s2);

然后

commonString=s1.replaceAll("[^"+s2+"]","");

【讨论】:

  • 谢谢@Ranjit 试过了,它也可以。仍在考虑哪种方法更优雅,还是上面的“findAll”。
  • 感谢@Ranjt 两个想法都奏效了,这个很有吸引力,因为我对正则表达式的简单理解可以处理它!
【解决方案3】:

你可以试试:

guess.findAll( /[$word]/ ).join()

【讨论】:

  • 谢谢@tim_yates 试过了,它有效。你能解释一下“加入”部分吗?我想我得到了正则表达式,但我不确定为什么斜杠会产生结果,我的理解是 [$word] 会这样做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多