2013-09-29 73 views
2

我需要替換字符串中的所有下劃線,除了那些落在兩個撇號範圍內的下劃線。例如:替換除撇號之外的所有下劃線(Java,字符串)

"first_name" => "first name" 
"code_numbers = '123_456'" => "code numbers = '123_456'" 

我目前只是扔掉使用.replaceAll(「_」,「「)的所有下劃線,因爲它們不是非常普遍的,但我想現在去觸摸所有基地,以防萬一。

回答

1

復活這個問題,因爲它已經陷入未提及的簡單的regex解決方案。 (發現你的問題而做一些研究的regex bounty quest。)

'[^']*'|(_) 

交替的左側匹配完整'single quoted strings'。我們將忽略這些匹配。右側與第1組匹配並捕獲下劃線,並且我們知道它們是正確的下劃線,因爲它們與左側的表達式不匹配。

這裏是工作的代碼(見online demo):

import java.util.*; 
import java.io.*; 
import java.util.regex.*; 
import java.util.List; 

class Program { 
public static void main (String[] args) throws java.lang.Exception { 

String subject = "code_numbers = '123_456'"; 
Pattern regex = Pattern.compile("'[^']*'|(_)"); 
Matcher m = regex.matcher(subject); 
StringBuffer b= new StringBuffer(); 
while (m.find()) { 
    if(m.group(1) != null) m.appendReplacement(b, " "); 
    else m.appendReplacement(b, m.group(0)); 
} 
m.appendTail(b); 
String replaced = b.toString(); 
System.out.println(replaced); 
} // end main 
} // end Program 

參考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...
4

這應該工作(這個正則表達式替換所有的_,後面跟着偶數個單引號)。當然,這需要你的報價要進行平衡:

String str = "\"code_numbers = '123_456'\""; 

str = str.replaceAll("(?x) " + 
       "_   " + // Replace _ 
       "(?=  " + // Followed by 
       " (?:  " + // Start a non-capture group 
       " [^']* " + // 0 or more non-single quote characters 
       " '  " + // 1 single quote 
       " [^']* " + // 0 or more non-single quote characters 
       " '  " + // 1 single quote 
       " )*  " + // 0 or more repetition of non-capture group (multiple of 2 quotes will be even) 
       " [^']* " + // Finally 0 or more non-single quotes 
       " $  " + // Till the end (This is necessary, else every _ will satisfy the condition) 
       ")   " , // End look-ahead 
         "");  // Replace with "" 
+0

你與說明用什麼編輯器? –

+0

@MaximShoustin。沒有。用手寫。 –

+0

@MaximShoustin。它在開頭是'(?x)'修飾符,它允許你用空格編寫正則表達式。 –

相關問題