我需要替換字符串中的所有下劃線,除了那些落在兩個撇號範圍內的下劃線。例如:替換除撇號之外的所有下劃線(Java,字符串)
"first_name" => "first name"
"code_numbers = '123_456'" => "code numbers = '123_456'"
我目前只是扔掉使用.replaceAll(「_」,「「)的所有下劃線,因爲它們不是非常普遍的,但我想現在去觸摸所有基地,以防萬一。
我需要替換字符串中的所有下劃線,除了那些落在兩個撇號範圍內的下劃線。例如:替換除撇號之外的所有下劃線(Java,字符串)
"first_name" => "first name"
"code_numbers = '123_456'" => "code numbers = '123_456'"
我目前只是扔掉使用.replaceAll(「_」,「「)的所有下劃線,因爲它們不是非常普遍的,但我想現在去觸摸所有基地,以防萬一。
復活這個問題,因爲它已經陷入未提及的簡單的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
參考
這應該工作(這個正則表達式替換所有的_,後面跟着偶數個單引號)。當然,這需要你的報價要進行平衡:
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 ""
你與說明用什麼編輯器? –
@MaximShoustin。沒有。用手寫。 –
@MaximShoustin。它在開頭是'(?x)'修飾符,它允許你用空格編寫正則表達式。 –