2016-05-10 3 views
1

по поводу возможного поста дубликатов: Replace only some groups with RegexRegex для сохранения номера в замене группы, содержащее число

Это не боян, как пост заменяет группу со статическим текстом, что я хочу, чтобы заменить группу, сохраняя текст в группе.

У меня есть некоторые тексты, содержащие шаблон, как:

\super 1 \nosupersub 
\super 2 \nosupersub 
... 
\super 592 \nosupersub 

Я хочу, чтобы заменить их, используя регулярные выражения таким образом, чтобы они стали:

<sup>1</sup> 
<sup>2</sup> 
... 
<sup>592</sup> 

Итак, я использую следующее регулярное выражение (обратите внимание на группа (\d+)):

RegexOptions options = RegexOptions.Multiline; //as of v1.3.1.0 default is multiline 
mytext = Regex.Replace(mytext, @"\s?\\super\s?(\d+)\s?\\nosupersub\s", @"<sup>\1</sup>", options); 

Однако, вместо того, чтобы получить то, что я хочу, я получил все результаты заменены <sup>\1</sup>:

<sup>\1</sup> 
<sup>\1</sup> 
... 
<sup>\1</sup> 

Если я пытаюсь регулярное выражение замены с помощью текстового редактора, как https://www.sublimetext.com, а также с помощью Python, это нормально.

Как получить такую ​​групповую замену (\d+) вот так (сохранить номер) в C#?

+0

Возможный дубликат [Заменить только некоторые группы с помощью регулярных выражений] (http://stackoverflow.com/questions/6005609/replace-only-some-groups-with-regex) –

+0

@ M.kazemAkhgary пост заменяет группу статический текст 'AA'. Я хочу, чтобы номер был сохранен. – Ian

+2

Я думаю, вам нужно использовать '$ 1' вместо' \ 1' в заменяющей строке. – petelids

ответ

2

Многих инструментов регулярных выражений использовать \1 обозначения для обозначения значения каких-либо групп в заменах шаблона (тот же синтаксис для обратной ссылки). По какой-то причине Microsoft решила вместо этого использовать $1 для обозначения в реализации регулярного выражения .NET. Обратите внимание, что обратные ссылки по-прежнему используют синтаксис \1 в .NET. Это только синтаксис в шаблоне замены, который отличается. См. Замены раздел this page для получения дополнительной информации.

+0

Спасибо. Оно работает – Ian

1

Я не тестировал этот код и не писал его из памяти, поэтому это может не сработать, но общая идея есть.

Зачем использовать регулярное выражение?

List<string> output = new List<string>(); 
foreach (string line in myText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None)) 
{ 
    string alteredLine = line.Replace("\super", "").Replace("\nosupersub", "").Trim(); 

    int n; 
    if (Int32.TryParse(alteredLine, out n)) 
    { 
     output.Add("<sup>" + n + "</sup>"); 
    } 
    else 
    { 
     //Add the original input in case it failed? 
     output.Add(line); 
    } 
} 

или для версии LinQ:

myText = myText.Split(new string[] { Environment.NewLine }, StringSplitOptions.None) 
       .Select(l => "<sup>" + l.Replace("\super", "").Replace("\nosupersub", "").Trim() + "</sup>"); 
+2

, потому что регулярное выражение короткое. –

+0

@ M.kazemAkhgary Не означает, что это должен быть правильный инструмент, плюс это может быть короче. Я просто добавил дополнительные проверки, которые OP может не понадобиться. – TheLethalCoder

+2

Я согласен с тем, что регулярное выражение не всегда является лучшим инструментом, но часто это происходит потому, что оно настолько мощное и настраиваемое (т. Е. Вы можете хранить шаблоны в файле конфигурации или БД). Независимо от того, является ли это лучшим инструментом для работы в этом случае, мы действительно не можем сказать. Это не кажется мне плохим вариантом для чего-то даже такого простого, поскольку для меня это короче, легче читать и, следовательно, легче поддерживать.При этом я понимаю, что для людей, которые не так знакомы с этим, есть большая кривая обучения, так что это фактор, который стоит учитывать в зависимости от вашей команды. –

Смежные вопросы