2011-01-17 3 views
0

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

+0

Я бы предложил использовать обычный синтаксис HTML для этого: '&__;'. – orlp

+0

Это выглядит подозрительно, как обход проблемы с кодировкой. –

ответ

3

С вы только хотите, чтобы заменить _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))); 
} 

EDIT: Благодаря Алан Муру за его C# опыта и улучшение регулярного выражения идей!

+0

спасибо, как я могу получить номер 2 для exmple после матча? потому что я должен сказать ему заменить его кодом символов этого номера – Bohn

+0

для этой части. Я пробовал это ((char) (Int32.Parse («$ 2»))) и работал, но проблема в том, что он не получает точку останова на ComputeReplacement вообще ... Я думаю, что что-то не так с шаблоном RegEx, который мы используем здесь, – Bohn

+1

Какая точка останова? Вы имеете в виду, что 'ComputeReplacement' вообще не называется? –

2

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

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

HEX:_CHR[0-9A-F]{1,4}
декабря:_CHR[0-9]{1,5}

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

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

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

EDIT: Что касается вашего соответствующего вопроса, я не могу дать конкретных подробностей, не зная вашего языка. Но в псевдо-коде, вы могли бы сделать что-то вдоль линий следующее:

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, но вы должны перевести его в зависимости от обстоятельств на любой язык вы используете , Если вам нужно объяснение любого из них, прокомментируйте это.

+0

Да, точно, ищем коэффициенты символов Юникода и заменяя их своими настоящими персонажами ... Я использовал ваш реестр DEC и хорошо работал ... теперь, что дальше? Хорошо, я говорю regEx.IsMatch (reg) ... затем он останавливается где-то, что находит совпадение ... так теперь, как я могу узнать, что было индексом того места, которое соответствовало? сколько еще символов я должен прочитать, и т. д. – Bohn

+0

Обновлен с некоторым кодом, который поможет с совпадением – eidylon

+0

О, на самом деле у Тима Пицкера есть лучший код для обработки матчей, если вы можете заставить его работать. Забыл о функции RegEx.Replace. – eidylon

1

Проблема с этим методом заключается в том, что если текст, следующий за символом, также является числом, шаблон регулярного выражения может легко принять его для остальной части символа. Вам будет намного лучше использовать стандарт 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(); 
}
Смежные вопросы