Удалить повторяющиеся символы с помощью регулярного выражения - PullRequest
2 голосов
/ 28 апреля 2010

Мне нужно сопоставить второе и последующие вхождения символа *, используя регулярное выражение. Я на самом деле использую метод Replace, чтобы удалить их, поэтому вот несколько примеров до и после:

test*     ->  test* (no change)
*test*    ->  *test
test** *e ->  test* e

Возможно ли сделать это с помощью регулярного выражения? Спасибо

Ответы [ 3 ]

4 голосов
/ 28 апреля 2010

Если .NET может справиться с произвольным количеством случаев, попробуйте заменить следующий шаблон пустой строкой:

(?<=\*.*)\*

.

PS Home:\> 'test*','*test*','test** *e' -replace '(?<=\*.*)\*',''
test*
*test
test* e

Другим способом был бы такой шаблон:

(?<=\*.{0,100})\*

, где число 100 может быть заменено размером целевой строки.

И тестирование следующего с Mono 2.0:

using System;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        Regex r = new Regex(@"(?<=\*.*)\*");
        Console.WriteLine("{0}", r.Replace("test*", ""));    
        Console.WriteLine("{0}", r.Replace("*test*", ""));    
        Console.WriteLine("{0}", r.Replace("test** *e", ""));                          
    }
}

также производится:

test*
*test
test* e
0 голосов
/ 28 апреля 2010
$str =~ s/\*/MYSPECIAL/;  #only replace the first *
$str =~ s/\*//g;          #replace all *
$str =~ s/MYSPECIAL/\*/;  #put * back
0 голосов
/ 28 апреля 2010

Неоптимальный, но другой подход. Запишите индекс первого вхождения, замените все вхождения и заново вставьте первое вхождение по зарегистрированному индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...