java - 使用正则表达式的codingbat wordEnds

标签 java regex

我正在尝试解决 wordEnds from codingbat.com使用正则表达式。

Given a string and a non-empty word string, return a string made of each char just before and just after every appearance of the word in the string. Ignore cases where there is no char before or after the word, and a char may be included twice if it is between two words.

wordEnds("abcXY123XYijk", "XY") → "c13i"
wordEnds("XY123XY", "XY") → "13"
wordEnds("XY1XY", "XY") → "11"
wordEnds("XYXY", "XY") → "XY"

这是最简单的,因为我可以用我目前的正则表达式知识来做到这一点:

public String wordEnds(String str, String word) {
  return str.replaceAll(
     ".*?(?=word)(?<=(.|^))word(?=(.|$))|.+"
       .replace("word", java.util.regex.Pattern.quote(word)),
     "$1$2"
  );
}

replace用于放置在实际的 word 中字符串到模式中以提高可读性。 Pattern.quote不需要通过他们的测试,但我认为这是基于正则表达式的正确解决方案所必需的。

正则表达式有两个主要部分:

  • 如果匹配尽可能少的字符“.*?”,word仍然可以找到“(?=word)”,然后向后查找以捕获紧接在其“(?<=(.|^))”之前的任何字符,匹配“word”,并期待捕获其后面的任何字符“(?=(.|$))”。
    • 初始的“if”测试确保仅当存在 word 时原子后向才会捕获。
    • 使用前瞻捕获后续字符不会消耗它,因此它可以用作进一步匹配的一部分
  • 否则匹配剩下的内容“|.+
    • 组 1 和组 2 将捕获空字符串

我认为这在所有情况下都有效,但显然相当复杂。我只是想知道其他人是否可以建议一个更简单的正则表达式来做到这一点。

注意:我不是在寻找使用 indexOf 的解决方案和一个循环。我想要一个基于正则表达式的 replaceAll解决方案。我还需要一个可以通过所有codingbat 测试的有效正则表达式。

<小时/>

我设法减少了 word 的出现在模式内只有一个。

".+?(?<=(^|.)word)(?=(.?))|.+"

我仍在寻找是否可以进一步简化它,但我还有另一个问题:

  • 通过这个最新的模式,我简化了 .|$到只是.?成功了,但如果我同样尝试简化 ^|..?它不起作用。这是为什么?

最佳答案

根据您的解决方案,我设法简化了代码:

public String wordEnds(String str, String word) {
  return str.replaceAll(".*?(?="+word+")(?<=(.|^))"+word+"(?=(.|$))|.+","$1$2");
}

另一种写法是:

public String wordEnds(String str, String word) {
  return str.replaceAll(
     String.format(".*?(?="+word+")(?<=(.|^))"+word+"(?=(.|$))|.+",word),
     "$1$2");
}

关于java - 使用正则表达式的codingbat wordEnds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566482/

相关文章:

java - Android:像 Dailymotion App 这样的视频播放器

java - 导出多个 jar 文件 - 可扩展性问题

java - 不应用 Java 中运算符的优先级

android - 如何在 Android 中使用正则表达式运行查询

java - 我应该将模式对象声明为静态的吗

javascript - JavaScript 中的正则表达式

java - 具有其他类型 Collection getter 的泛型类

java - getResourceAsStream(file) 在哪里搜索文件?

java - 正则表达式模式元数据

javascript - 替换不在属性之间的文本