2012-05-17 126 views
4

比賽中代替單個字符我有我試圖做一個查找和替換上一個簡單的模式。它需要用週期替換所有破折號,當它們被數字包圍時。通過正則表達式

替換這些時期:

3-54 
32-11 
111-4523mhz 

像這樣:

3.54 
32.11 
111.4523mhz 

不過,我不想更換儀表板裏的任何東西像這樣:

Example-One 
A-Test 

:使用以下嘗試
preg_replace('/[0-9](-)[0-9]/', '.', $string); 

然而,這將取代只是中間的整場比賽,而不是。你怎樣才能取代比賽的一部分?

回答

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

:)

編輯應該做的伎倆:一些更多的解釋:

通過正則表達式中使用(),您創建一個組。該組可用於替換。 $1獲得與第一組相匹配替換,$2獲取與第二匹配組等取代。

這意味着如果您(例如)將'$1.$2'更改爲'$2.$1',則該操作會交換這兩個數字。 在你的情況下,這不是有用的行爲,但也許它可以幫助你更好地理解原則。

+0

分組是在你的正則表達式工具箱中一個偉大的工具!編輯並補充解釋大加讚賞 –

+0

例如,在'kate'編輯器,你可以使用'\ 1'改爲1 $等 –

0

可以使用反向引用留住你想保持比賽的部分:

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

取決於你使用正則表達式實現,可以使用非捕獲組:

preg_replace('/(?<=[0-9])-(?=[0-9])/', '.', $string); 
-1

下面是幾個實現同樣的方式。

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()); 
    } 
} 

+0

似乎不限制數量。 –

+0

是的,它是通用的,所以它將佔任何非空間字符。 – Rituraj