簡體   English   中英

正則表達式僅匹配未轉義的特殊字符

[英]Regular expression to match unescaped special characters only

我正在嘗試提出一個正則表達式,它只能匹配字符串中沒有特殊轉義序列的字符。

例如,在字符串中Is ? stranded//? Is ? stranded//? ,我希望能夠取代? 沒有用另一個字符串進行轉義,所以我可以得到這樣的結果: **Is Dave stranded?**

但對於我的生活,我一直無法找到方法。 我只提出了吃掉所有可替換字符的正則表達式。

如何構造一個只匹配前面沒有轉義序列的字符的正則表達式?

使用負面的外觀,這是他們的目的!

(?<!//)[\\?]

制動它:

(
    ?<!    #The negative look behind.  It will check that the following slashes do not exist.
    //     #The slashes you are trying to avoid.
)
[\?]       #Your special charactor list.

只有在找不到//時,它才會在搜索的其余部分進行。

我認為在Java中它需要再次轉義為字符串,例如:

Pattern p = Pattern.compile("(?<!//)[\\?]");

試試這個Java代碼:

str="Is ? stranded//?";
Pattern p = Pattern.compile("(?<!//)([?])");
m = p.matcher(str);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group(1).replace("?", "Dave"));
}
m.appendTail(sb);
String s = sb.toString().replace("//", "");
System.out.println("Output: " + s);

OUTPUT

Output: Is Dave stranded?

我正在考慮這個,並有第二個更簡單的解決方案,避免正則表達式。 其他答案可能更好,但我想我可能會發布它。

String input = "Is ? stranded//?"; 
String output = input
    .replace("//?", "a717efbc-84a9-46bf-b1be-8a9fb714fce8")
    .replace("?", "Dave")
    .replace("a717efbc-84a9-46bf-b1be-8a9fb714fce8", "?");

只是保護“//?” 用一些獨特的東西(如guid)替換它。 然后你知道任何剩下的問號都是合理的游戲。

使用分組。 這是一個例子:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("([^/][^/])(\\?)");
        String s = "Is ? stranded//?";
        Matcher m = p.matcher(s);
        if (m.matches)
            s = m.replaceAll("$1XXX").replace("//", "");
        System.out.println(s + " -> " + s);
    }
}

輸出:

$ java Test
Is ? stranded//? -> Is XXX stranded?

在這個例子中,我是:

  • 首先替換任何非逃脫? 用“XXX”,
  • 然后,刪除“//”轉義序列。

編輯使用if (m.matches)確保正確處理不匹配的字符串。

這只是一個快速而骯臟的例子。 顯然,你需要充實它,使其更加強大。 但它得到了一般的想法。

我用過這個:

((?:^|[^\\])(?:\\\\)*[ESCAPABLE CHARACTERS HERE])

演示: https//regex101.com/r/zH1zO3/4

匹配除轉義序列之外的一組字符,然后是正則表達式特殊字符。 您可以使用倒置字符類( [^/] )作為第一位。 特殊情況下,字符串前面有一個未轉義的正則表達式字符。

嘗試匹配:

(^|(^.)|(.[^/])|([^/].))[special characters list]
String aString = "Is ? stranded//?";

String regex = "(?<!//)[^a-z^A-Z^\\s^/]";
System.out.println(aString.replaceAll(regex, "Dave"));

正則表達式的一部分[^az^AZ^\\\\s^/]匹配非字母數字,空格或非正斜杠字符。

(?<!//)部分做了負面的觀察 - 請參閱docco以獲取更多信息

這給出了輸出Is Dave stranded//?

暫無
暫無

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

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