8

我有一个简单的模式,我正在尝试对其进行查找和替换。当它们被数字包围时,它需要用句点替换所有破折号。

替换这些中的句点:

3-54
32-11
111-4523mhz

像这样:

3.54
32.11
111.4523mhz

但是,我不想替换以下任何内容中的破折号:

Example-One
A-Test

我尝试过使用以下内容:

preg_replace('/[0-9](-)[0-9]/', '.', $string);

但是,这将替换整个匹配,而不仅仅是中间。你如何只替换匹配的一部分?

4

4 回答 4

13
preg_replace('/([0-9])-([0-9])/', '$1.$2', $string);

应该做的伎俩:)

编辑:更多解释:

通过在正则表达式中使用(和,您可以创建一个组。)该组可用于替换。$1被第一个匹配组$2替换,被第二个匹配组替换,依此类推。

这意味着如果您(例如)更改'$1.$2''$2.$1',则该操作将交换两个数字。在您的情况下,这不是有用的行为,但也许它可以帮助您更好地理解原理。

于 2012-05-17T14:51:53.627 回答
2

根据您使用的正则表达式实现,您可以使用非捕获组:

preg_replace('/(?<=[0-9])-(?=[0-9])/', '.', $string);
于 2012-05-17T14:53:00.543 回答
0

您可以使用反向引用来保留要保留的匹配部分:

preg_replace('/([0-9])-([0-9])/', '$1.$2', $string);
于 2012-05-17T14:52:21.600 回答
-2

以下是实现相同目标的几种方法。

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

/**
 * Created by Rituraj_Jain on 7/14/2017.
 */
public class Main {

    private static final Pattern pattern = Pattern.compile("(\\S)-(\\S)");
    private static final String input = "Test-TestBad-ManRituRaj-Jain";

    public static void main(String[] args) {
        Matcher matcher = pattern.matcher(input);
        String s = matcher.replaceAll("$1 $2");
        System.out.println(s);

        System.out.println(input.replaceAll(pattern.pattern(), "$1 $2"));


    }
    public static void main1(String[] args) {
        Matcher matcher = pattern.matcher(input);
        StringBuffer finalString = new StringBuffer();
        while(matcher.find()){
            String replace = matcher.group().replace("-", " ");
            matcher.appendReplacement(finalString, replace);
        }
        matcher.appendTail(finalString);
        System.out.println(input);
        System.out.println(finalString.toString());
    }
}

于 2017-07-15T02:32:30.450 回答