簡體   English   中英

正則表達式獲取除冒號之外的兩個冒號之間的值

[英]Regex to get value between two colon excluding the colons

我有一個像這樣的字符串:

something:POST:/some/path

現在我想從字符串中單獨使用POST。 我使用這個正則表達式做到了這一點

:([a-zA-Z]+):

但這給了我一個冒號值。 即我得到這個:

:POST:

但我需要這個

POST

我的代碼匹配相同並替換它如下:

String ss = "something:POST:/some/path/";
Pattern pattern = Pattern.compile(":([a-zA-Z]+):");
Matcher matcher = pattern.matcher(ss);

if (matcher.find()) {
    System.out.println(matcher.group());
    ss = ss.replaceFirst(":([a-zA-Z]+):", "*");
}
System.out.println(ss);

編輯:

我決定使用lookahead / lookbehind正則表達式,因為我不想使用冒號replace ,例如:*: . 這是我的最終解決方案。

String s = "something:POST:/some/path/";
String regex = "(?<=:)[a-zA-Z]+(?=:)";

Matcher matcher = Pattern.compile(regex).matcher(s);

if (matcher.find()) {
    s = s.replaceFirst(matcher.group(), "*");
    System.out.println("replaced: " + s);
} 
else {
    System.out.println("not replaced: " + s);
}

有兩種方法:

  • 保留Java代碼,並使用lookahead / lookbehind (?<=:)[a-zA-Z]+(?=:) ,或者
  • 更改Java代碼以使用":*:"替換結果

注意:您可能希望為正則表達式定義String常量,因為您在不同的調用中使用它。

UPDATE

查看更新,您只需要ReplaceFirst

String result = s.replaceFirst(":[a-zA-Z]+:", ":*:");

請參閱Java演示

當你使用(?<=:)[a-zA-Z]+(?=:) ,正則表達式引擎會檢查字符串中的每個位置是否為*之前的* ,並且一旦找到,就會嘗試匹配1個以上的ASCII字母和然后聲稱有一個:在他們之后。 使用:[A-Za-z]+: ,僅在找到正則表達式引擎后才開始檢查:字符。 然后,匹配后:POST: ,替換模式替換整個匹配。 在替換模式中對冒號進行硬編碼是完全可以的,因為它們在正則表達式模式中是硬編碼的

原始答案

您只需要訪問第1組:

if (matcher.find()) {
    System.out.println(matcher.group(1));
}

請參閱Java演示

你的:([a-zA-Z]+):正則表達式包含一個捕獲組 (見(....)子模式)。 這些組自動編號:第一個具有索引1 ,第二個具有索引2 ,等等。

要替換它,請使用Matcher#appendReplacement()

String s = "something:POST:/some/path/";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile(":([a-zA-Z]+):").matcher(s);
while (m.find()) {
    m.appendReplacement(result, ":*:");
}
m.appendTail(result);
System.out.println(result.toString());

另一個演示

正如所指出的,可以使用reqex捕獲的組來替換。

以下代碼執行了它:

  String ss = "something:POST:/some/path/";
    Pattern pattern = Pattern.compile(":([a-zA-Z]+):");
    Matcher matcher = pattern.matcher(ss);

    if (matcher.find()) {
        ss = ss.replaceFirst(matcher.group(1), "*");
    }
    System.out.println(ss);

這是你的解決方案:

regex = (:)([a-zA-Z]+)(:)

代碼是:

String ss = "something:POST:/some/path/";

ss = ss.replaceFirst("(:)([a-zA-Z]+)(:)", "$1*$3");

ss現在包含:

東西:*:/一些/路徑/

我相信你正在尋找...

暫無
暫無

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

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