Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Regex Добавлено: 13.10.08 04:06  

Автор вопроса:  BG(Алексей)
Нужно удалить и заменить теги в тексте.

Пример строки исходной строки:
\cf1 retSB.Insert(m.Index + st, "\\cf1 ")\cf0


С удалением все нормально. После удаления тегов через
cleaned = Regex.Replace(cleaned, "(\\cf\d+\s)", "")
получаю
retSB.Insert(m.Index + st, "\")


Но это не то, что мне нужно. Мне нужен результат следующего вида:
retSB.Insert(m.Index + st, "\cf1 ")


Как такое устроить?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 13.10.08 08:42
  1.  
  2. using System;
  3. using System.Text.RegularExpressions;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             string testString = "\\cf1 retSB.Insert(m.Index + st, \"\\\\cf1 \")\\cf0";
  12.             string pattern = @"(?<!\\)\\cf\d+\s*|\\(?!\\)";
  13.             
  14.             Console.WriteLine("INPUT:\t\t{0}",testString);
  15.             Console.WriteLine("PATTERN:\t{0}", pattern);
  16.             Console.WriteLine("OUTPUT:\t\t{0}", Regex.Replace(testString, pattern, ""));
  17.  
  18.             Console.ReadLine();
  19.         }
  20.     }
  21. }



Результат
  1.  
  2. INPUT:          \cf1 retSB.Insert(m.Index + st, "\\cf1 ")\cf0
  3. PATTERN:        (?<!\\)\\cf\d+\s*|\\(?!\\)
  4. OUTPUT:         retSB.Insert(m.Index + st, "\cf1 ")

Ответить

Номер ответа: 2
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #2 Добавлено: 14.10.08 02:24
Спасибо EROS.

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 14.10.08 05:29
+1

Ответить

Номер ответа: 4
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #4 Добавлено: 14.10.08 07:15
Не выходит каменный цветок:(

Делаю подстветку синтаксиса VB, для личных целей.
Пытаюсь отформатировать строку по принципу RichTextBox. Записываю.
Когда стандартный код, без тэгов, то все нормально. Но если присутствуют тэги, все ломается.
Уже мозги трескаются. С Redgex я не дружу.

EROS, я когда-то видел твою DLL для подсветки у Алексея на сайте. Сейчас не могу найти.
Если она ещё живая, дай сылку.

Ответить

Номер ответа: 5
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #5 Добавлено: 14.10.08 07:17
Или если возможно пример форматирования/расформатирования(с тэгами).

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 14.10.08 08:00
У Алексея была старая версия.. я ее переделал, но к несчастью неделю назад хард с проектами приказал долго жить.. так что увы.. ничем не смогу помочь.. :(

Ответить

Номер ответа: 7
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #7 Добавлено: 15.10.08 01:06
Может поможешь составить Regex? Я покажу исходную строку.

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 15.10.08 08:03
Да я тоже не особо в Regex силен, но как говорится я не гинеколог, но посмотреть могу :).

Ответить

Номер ответа: 9
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #9 Добавлено: 16.10.08 01:57
Когда стандартный код, без тэгов, то все нормально. Но если присутствуют тэги, все ломается.

Причину я понял. Но решить не могу. Нужен Regex.

Берём строку(Пример строки взят из RichTextBox.)

  1. Dim InputText As String = "{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}{\colortbl ;\red0\green0\blue255;\red170\green0\blue0;\red0\green150\blue0;}\viewkind4\uc1\pard\cf1\lang1033\f0\fs20"


и теперь нужно привести её к такому виду
  1. "\{\\rtf1\\ansi\\deff0\{\\fonttbl\{\\f0\\fnil\\fcharset0 Courier New;\}\}\{\\colortbl ;\\red0\\green0\\blue255;\\red170\\green0\\blue0;\\red0\\green150\\blue0;\}\\viewkind4\\uc1\\d\\cf1\\lang1033\\f0\\fs20"

Мне нужно заэкранировать все тэги или метасимволы(как правильно?), которые находятся в двойных кавычках.
Данная строка взята как образец. Строки могут быть разные и содержать могут разные метасимволы. Нужно заэкранировать то, что может быть прочитанно не по своему жизненному значению.


Далее я форматирую строку и она получает такой вид
  1. \cf2 "\{\\rtf1\\ansi\\deff0\{\\fonttbl\{\\f0\\fnil\\fcharset0 Courier New;\}\}\{\\colortbl ;\\red0\\green0\\blue255;\\red170\\green0\\blue0;\\red0\\green150\\blue0;\}\\viewkind4\\uc1\\d\\cf1\\lang1033\\f0\\fs20"\cf0\par

Затем, со временем, мне нужно отредактировать строку. И вот здесь мне нужно привести строку к первоначальному виду. Убрать все, что экранировали, а так же все теги, которые я добавлял. Как убрать свои тэги, я знаю.

Вроде обьяснил.
Теги, которые я использую
\cf0, \cf1, \cf2, \cf3, \par, }

Ответить

Номер ответа: 10
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 16.10.08 08:45
  1.  
  2. using System;
  3. using System.Diagnostics;
  4. using System.Text.RegularExpressions;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             string testString = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}{\colortbl ;\red0\green0\blue255;\red170\green0\blue0;\red0\green150\blue0;}\viewkind4\uc1\pard\cf1\lang1033\f0\fs20";
  13.             string pattern = @"\\|\{|\}";
  14.             string replacement = @"\$0";
  15.  
  16.             // escape
  17.             string result = Regex.Replace(testString, pattern, replacement);
  18.             Debug.WriteLine(string.Format("=========== {0} ===========", "Escape metatags"));
  19.             Debug.WriteLine(string.Format("INPUT:\t{0}", testString));
  20.             Debug.WriteLine(string.Format("PATTERN:\t{0}", pattern));
  21.             Debug.WriteLine(string.Format("OUTPUT:\t{0}", result));
  22.  
  23.             // unescape
  24.             pattern = @"\\(?!\\)";
  25.             replacement = string.Empty;
  26.             Debug.WriteLine(string.Format("=========== {0} ===========", "Unescape metatags"));
  27.             Debug.WriteLine(string.Format("INPUT:\t{0}", result));
  28.             Debug.WriteLine(string.Format("PATTERN:\t{0}", pattern));
  29.             result = Regex.Replace(result, pattern, replacement);
  30.             Debug.WriteLine(string.Format("OUTPUT:\t{0}", result));
  31.  
  32.             //test
  33.             Debug.Assert(testString.Equals(result),"Input and output string aren't equal");
  34.             
  35.             Console.ReadLine();//wait
  36.         }
  37.     }
  38. }
  39.  
  40. // Result
  41. //=========== Escape metatags ===========
  42. //INPUT: {\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}{\colortbl ;\red0\green0\blue255;\red170\green0\blue0;\red0\green150\blue0;}\viewkind4\uc1\pard\cf1\lang1033\f0\fs20
  43. //PATTERN: \\|\{|\}
  44. //OUTPUT: \{\\rtf1\\ansi\\deff0\{\\fonttbl\{\\f0\\fnil\\fcharset0 Courier New;\}\}\{\\colortbl ;\\red0\\green0\\blue255;\\red170\\green0\\blue0;\\red0\\green150\\blue0;\}\\viewkind4\\uc1\\pard\\cf1\\lang1033\\f0\\fs20
  45. //=========== Unescape metatags ===========
  46. //INPUT: \{\\rtf1\\ansi\\deff0\{\\fonttbl\{\\f0\\fnil\\fcharset0 Courier New;\}\}\{\\colortbl ;\\red0\\green0\\blue255;\\red170\\green0\\blue0;\\red0\\green150\\blue0;\}\\viewkind4\\uc1\\pard\\cf1\\lang1033\\f0\\fs20
  47. //PATTERN: \\(?!\\)
  48. //OUTPUT: {\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}{\colortbl ;\red0\green0\blue255;\red170\green0\blue0;\red0\green150\blue0;}\viewkind4\uc1\pard\cf1\lang1033\f0\fs20

Ответить

Номер ответа: 11
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #11 Добавлено: 17.10.08 01:29
EROS, большое человеческое спасибо.

Может кто знает нормальный рессурс, где можно доходчиво почитать о Regex?

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 28.10.08 01:30
msdn

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам