用于替换特定子字符串之前和之后的特定字符的正则表达式

时间:2015-04-09 01:14:45

标签: java regex string

我正在进行Java CodingBat练习。 Here是我刚刚完成的那个:

  

给定一个字符串和一个非空字符串,在字符串中每次出现单词之前和之后返回由每个char组成的字符串。忽略单词之前或之后没有字符的情况,如果字符位于两个单词之间,则可以包含两次字符。

我的代码,有效:

public String wordEnds(String str, String word){

    String s = "";
    String n = " " + str + " "; //To avoid OOB exceptions

    int sL = str.length();
    int wL = word.length();
    int nL = n.length();

    int i = 1;

    while (i < nL - 1) {

        if (n.substring(i, i + wL).equals(word)) {
            s += n.charAt(i - 1);
            s += n.charAt(i + wL);
            i += wL;
        } else {
            i++;
        }
    }

    s = s.replaceAll("\\s", "");

    return s;
}

我的问题是关于正则表达式。我想知道以上是否可以使用正则表达式语句,如果是,那怎么办?

3 个答案:

答案 0 :(得分:3)

您可以使用Java正则表达式对象PatternMatcher来执行此操作。

public class CharBeforeAndAfterSubstring {
    public static String wordEnds(String str, String word) {
        java.util.regex.Pattern p = java.util.regex.Pattern.compile(word);
        java.util.regex.Matcher m = p.matcher(str);
        StringBuilder beforeAfter = new StringBuilder();

        for (int startIndex = 0; m.find(startIndex); startIndex = m.start() + 1) {
            if (m.start() - 1 > -1)
                beforeAfter.append(Character.toChars(str.codePointAt(m.start() - 1)));
            if (m.end() < str.length())
                beforeAfter.append(Character.toChars(str.codePointAt(m.end())));
        }

        return beforeAfter.toString();
    } 
    public static void main(String[] args) {
        String x = "abcXY1XYijk";
        String y = "XY";
        System.out.println(wordEnds(x, y));

    }
} 

答案 1 :(得分:1)

要在另一个字符串中每次出现之前和之后获取包含字符的字符串,可以使用正则表达式:

"(^|.)" + str + "(.|$)"

然后你可以遍历这些组并连接它们。

此表达式将查找(^|.),字符串^的开头或任何字符.,后跟str值,然后是(.|$) ,任何字符.或字符串$的结尾。

您可以尝试这样的事情:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public String wordEnds(String str, String word){
    Pattern p = Pattern.compile("(.)" + str + "(.)");
    Matcher m = p.matcher(word);
    String result = "";
    int i = 0;
    while(m.find()) {
        result += m.group(i++);
    }
    return result;
}

答案 2 :(得分:1)

(?=(.|^)XY(.|$))

试试这个。只需抓住捕获并删除Noneempty值。请参阅演示。

https://regex101.com/r/sJ9gM7/73