Помощь для регулярного выражения - PullRequest
0 голосов
/ 17 января 2011

Я новичок в RegeX и мне нужно что-то, что делает следующее: input: какое-то слово, которое начинается со всего, затем следует что-то фиксированное, например "_CHR", а затем сразу несколько цифр, таких как 123, а затем что-нибудь еще. Я хочу найти их и заменить это число символьным представлением этого числа ... так например: input: "Здравствуйте, Pi_CHR241to Как дела" будет заменен на "Привет, как дела?"

Ответы [ 3 ]

3 голосов
/ 17 января 2011

Так как вы хотите заменить только _CHRnnn биты, достаточно найти:

_CHR(\d+)

После совпадения номер обратной ссылки 1 будет содержать код символа.

Сэто, вы можете:

string resultString = null;
resultString = Regex.Replace(subjectString, @"_CHR(\d+)", new MatchEvaluator(ComputeReplacement));

public String ComputeReplacement(Match m) {
    return ToString((char)(Int32.Parse(m.Groups[1].Value)));
}

РЕДАКТИРОВАТЬ: Спасибо Алану Муру за его опыт C # и идеи по улучшению регулярных выражений!

2 голосов
/ 17 января 2011

Ну, теоретически ваша строка может начинаться или заканчиваться одной из ваших строк «кодирования», поэтому я не знаю, что вам нужно беспокоиться о том, что находится до или после нее, а просто найти вхождения любого экземпляра этого шаблона.

Если вы ищете какой-либо символ Юникода, вы можете искать до 4 шестнадцатеричных цифр или до 5 десятичных цифр.Поэтому ваш RegEx может выглядеть примерно так:

HEX: _CHR[0-9A-F]{1,4}
DEC: _CHR[0-9]{1,5}

Если вы хотитечтобы соответствовать какому-либо формату, попробуйте что-то вроде следующего:

_CHR([0-9A-F]{1,4}|[0-9]{1,5})

Я не думаю, что вы можете сделать нужную замену с RegEx напрямую.RegEx обычно просто делает прямую замену, где вы ищете функциональную замену.Но любой язык, на котором вы кодируете, должен быть достаточно простым, чтобы получить коллекцию совпадений и пройти по ней, анализируя их и заменяя при необходимости.

РЕДАКТИРОВАТЬ: Относительно вашего соответствующего вопроса, я не могу дать конкретику, не зная вашего языка.Но в псевдокоде вы должны сделать что-то вроде следующего:

Dim pMatches = RegEx.Matches(myInput, myPattern)  
Const pfx As String  = "_CHAR", ccode As String  
For Each m As Match in pMatches  
    ccode = m.Value.Replace(pfx, "")
    myInput.Replace(m.Value, GetUniChar(ccode))  
Next

Это примерно синтаксис VB.NET, но вам нужно будет перевести его соответствующим образом на любой язык, который выповторное использование.Если вам нужно объяснение какого-либо из них, прокомментируйте.

1 голос
/ 17 января 2011

Проблема этого метода заключается в том, что если текст, следующий за символом, также является числом, шаблон регулярного выражения может легко принять его за остальную часть символа.Вам было бы гораздо лучше использовать вместо этого html-стандарт &#F1;.Если вы должны использовать метод в примере, вы должны использовать фиксированное количество цифр.

string resultString = null;
resultString = Regex.Replace(subjectString, @"&#([0-9A-Fa-f]+);", new MatchEvaluator(ComputeReplacement));
//alternateive: @"_CHR(\d{3})" - fixed number of digits
//or: @"_CHR(\d+)" - ABSOLUTELY SURE a number will never follow a special character

public string ComputeReplacement(Match m) {
    return ((char)(int.Parse(m.Groups[1].Value, NumberStyles.HexNumber))).ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...