Java正则表达式前瞻

时间:2015-07-20 15:12:27

标签: java regex

我需要使用正则表达式替换特定字符的字符串。字符串采用以下格式:

"abc.edf" : "abc.abc", "ghi.ghk" : "bbb.bbb" , "qwq.tyt" : "ddd.ddd" 

我需要替换冒号之前的引号中的字符串之间的句点,而不是冒号之后和逗号之前的引号中的字符串之间的句号。'。'。有人可以解释一下吗?

5 个答案:

答案 0 :(得分:2)

此模式将匹配您要触摸的整个部分:"\w{3}\.\w{3}" : "\w{3}\.\w{3}"。由于它包含冒号和两侧的值,因此它与值之间存在逗号的那些不匹配。根据您的需要,您可能需要将\w更改为其他角色类。

但是,我确信你知道,你不想替换整个字符串。您只想替换一个字符。有两种方法可以做到这一点。您可以使用预测和后视来排除除结果匹配的句点之外的所有其他内容:

  • 模式:(?<="\w{3})\.(?=\w{3}" : "\w{3}\.\w{3}")
  • 替换::

或者,如果前瞻和后视混淆了你,你可以抓住整个事物,并在替换值中包含捕获组中的原始值:

  • 模式:("\w{3})\.(\w{3}" : "\w{3}\.\w{3}")
  • 替换:$1:$2

答案 1 :(得分:1)

尝试使用以下模式:/。(?= [a-z] +)/ g

使用regex-demo替换@ regex101

Java Working Demo:

public class StackOverFlow31520446 {

    public static String text;
    public static String pattern;
    public static String replacement;

    static {
        text = "\"abc.edf\" : \"123.231\", \"ghi.ghk\" : \"456.678\" , \"qwq.tyt\" : \"141.242\"";
        pattern = "\\.(?=[a-z]+)";
        replacement = ";";
    }

    public static String replaceMatches(String text, String pattern, String replacement) {
        return text.replaceAll(pattern, replacement);
    }

    public static void main(String[] args) {
        System.out.println(replaceMatches(text, pattern, replacement));
    }   
}

答案 2 :(得分:1)

不确定你打算用字符串做什么,但这是一种方法 匹配报价的内容。

内容位于捕获缓冲区1中 您可以使用回调来替换中的点 内容,在主要替换功能中传回。

查找:"([^"]*\.[^"]*)"(?=\s*:)
替换:" + func( call to replace dots from capt buff 1 ) + "

格式化:

 "                             # Open quote
 ( [^"]* \. [^"]* )            # (1), group 1 - contents
 "                             # Close quote
 (?=                           # Lookahead, must be a colon
      \s* 
      :
 )

答案 3 :(得分:0)

如果采用不同的方法(可能更快)。在遍历所有字符串的循环中,首先尝试字符串是否与\d*\.?\d*匹配 - 如果不匹配,请使用.替换:(不使用任何正则表达式)。

这会解决你的问题吗?

答案 4 :(得分:0)

你可以不用看看就可以做到:

str = str.replaceAll("(\\D)\\.(\\D)", "$1:$2");

应该足以完成任务。