簡體   English   中英

使用正則表達式查找字符串中的子字符串-JAVA

[英]Find a subtring in a string using a regular expression - JAVA

假設我有一個字符串“ kk abcjkmkc jjkocc abc jjj'abckkkkkkkkkkkkkkkkkk'”

我想替換僅在單引號之外的字符串中的子字符串abc,但不起作用。

這是我的代碼

String str = " kk a.b.cjkmkc  jjkocc a.b.c. jjj 'a.b.ckkkkkkkkkkkkkkkk ' ";
 Pattern p = Pattern.compile("a\\.b\\.c");
 Matcher m = p.matcher(str); 
 int x = m.find()
 `

要在引號外搜索子字符串,可以執行以下操作:

Pattern pat = Pattern.compile("^(?:[^']|'[^']*')*?a\\.b\\.c");

第一部分將跳過:

不是引號( [^'] )的每個字符,或

用引號( '[^']*' )括起來的每個非引號字符序列。

一旦跳過了這些內容,則如果看到所需的模式,它將知道它不在引號內。

這將處理一個簡單的情況。 如果事情開始變得更加復雜,例如,您想允許\\'在輸入字符串中用引號引起來,就像C或Java在字符串文字中一樣,則正則表達式開始變得更加復雜,您可以快速地得出一個結論:您的正則表達式不可讀或正則表達式不合適。

編輯:修復了在第二個*之后放置“不願意”的限定詞,以便找到第一個abc

編輯2:如果要替換找到的子字符串,它將變得更加棘手。 上面的模式通過abc匹配字符串的整個開頭,而我無法進行后視工作,因此匹配項abc部分。 我認為您需要將字符串的開頭放入組中,然后在替換字符串中使用$1復制開頭:

Pattern pat = Pattern.compile("^((?:[^']|'[^']*')*?)a\\.b\\.c");
Matcher m = pat.matcher(source);
if (m.find()) {
    result = m.replaceFirst("$1replacement");
}

我不確定replaceAll可以與此一起使用,因此,如果要替換所有它們,則可能需要循環。

使用以下模式: a\\.b\\.c(?=(([^']*'){2})*[^']*$) 演示

我不會理會REGEX。

public static void main(String[] args) {

    String str = " kk a.b.cjkmkc  jjkocc a.b.c. jjj 'a.b.ckkkkkkkkkkkkkkkk ' ";
    String[] s = str.split("'");
    str = s[0].replaceAll("[abc]", "") + "'"+ s[1]+"'"
            + s[2].replaceAll("[abc]", "");

    System.out.println(str);
}

OP:

kk ..jkmk  jjko ... jjj 'a.b.ckkkkkkkkkkkkkkkk '

低效..但是有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM