регулярное выражение, заменяющее текст - PullRequest
1 голос
/ 11 марта 2010

Мне нужно регулярное выражение для замены строки.

<span class=\"Translation\" lang=\"ThisLanguage\">

с этим:

<span class=\"Translation\" lang=\"ThisLanguage\" onDblClick=\"window.external.MyFunction(ThisLanguage)\">

В этой строке много языков, каждый из которых содержит свой "ThisLanguage"

кто-нибудь знает, как это можно сделать ??

Я работаю с C # .Net

Спасибо!

Ответы [ 4 ]

1 голос
/ 11 марта 2010

Обычно не рекомендуется анализировать HTML с помощью регулярных выражений, поскольку HTML не является регулярным , и существует достаточно граничных случаев, чтобы отключить все, кроме самых тривиальных сценариев. Для всех, кроме самых тривиальных примеров, я бы лучше проанализировал HTML с помощью анализатора HTML и управлял им с помощью подходящего API (например, DOM)

1 голос
/ 11 марта 2010

Немного многословно, но Expresso экономит много времени!

//  using System.Text.RegularExpressions;

/// <summary>
///  Regular expression built for C# on: Thu, Mar 11, 2010, 04:37:21 PM
///  Using Expresso Version: 3.0.2766, http://www.ultrapico.com
///  
///  A description of the regular expression:
///  
///  <span.*?class="
///      <span
///      Any character, any number of repetitions, as few as possible
///      class="
///  [1]: A numbered capture group. [.*?]
///      Any character, any number of repetitions, as few as possible
///  ".*?lang="
///      "
///      Any character, any number of repetitions, as few as possible
///      lang="
///  [2]: A numbered capture group. [.*?]
///      Any character, any number of repetitions, as few as possible
///  ">
///      ">
///  
///
/// </summary>
public static Regex regex = new Regex(
      "<span.*?class=\"(.*?)\".*?lang=\"(.*?)\">",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );


// This is the replacement string
public static string regexReplace = 
      "<span class=\"$1\" lang=\"$2\" onDblClick=\"window.external."+
      "MyFunction(ThisLanguage)\">\r\n";


//// Replace the matched text in the InputText using the replacement pattern
// string result = regex.Replace(InputText,regexReplace);

//// Split the InputText wherever the regex matches
// string[] results = regex.Split(InputText);

//// Capture the first Match, if any, in the InputText
// Match m = regex.Match(InputText);

//// Capture all Matches in the InputText
// MatchCollection ms = regex.Matches(InputText);

//// Test to see if there is a match in the InputText
// bool IsMatch = regex.IsMatch(InputText);

//// Get the names of all the named and numbered capture groups
// string[] GroupNames = regex.GetGroupNames();

//// Get the numbers of all the named and numbered capture groups
// int[] GroupNumbers = regex.GetGroupNumbers();
0 голосов
/ 11 марта 2010

Я бы не использовал регулярное выражение. Я бы использовал jQuery.

// set the lang value to ThisLanguage
$('span.Translation').attr('lang', 'ThisLanguage'); 
// add the onDblClick event with the value
$('span.Translation').attr('onDblClick', 'window.external.MyFunction(ThisLanguage)'); 

Или, если вы просто генерируете строки (которыми вы, возможно, не являетесь, но ЕСЛИ вы можете это сделать), и выталкиваете их, почему бы не сделать это?

string spanTag = String.Format("<span class=\"Translation\" lang=\"{0}\" onDblClick=\"window.external.MyFunction({0})\">", "ThisLanguage");
0 голосов
/ 11 марта 2010

Анализ HTML с помощью регулярных выражений подобен 10-му кругу ада. Я не шучу. Вы бы лучше tidy запустили его (не уверен, что в .NET есть приборка), а затем запустили его через анализатор XML. Таким образом, вы можете извлечь определенные атрибуты, такие как class и lang, а затем добавить новый атрибут с именем onDblClick в ваш узел span.

В противном случае, наивный подход (не уверен, что синтаксис в .NET, но это в Perl):

$str =~ s/<span\(.*?\)lang=\\"\(.*?\)\\">/<span$1lang=\\"$2\\" onDblClick=\\"window.external.MyFunction($2)\\">/

Здесь важен шаблон для сопоставления (включая снимки):

<span\(.*\)lang=\\"\(.*?\)\\">

Это соответствует <span, за которым следует что угодно, затем lang=\" с любым значением между \" s, за которым следует \">.

Шаблон замены:

<span$1lang=\\"$2\\" onDblClick=\\"window.external.MyFunction($2)\\">

Это создает <span, за которым следует все, что соответствует, вплоть до lang ($1), а затем lang=\", за которым следует захваченное имя языка ($2), а затем onDblClick.

Я не знаком с .NET, поэтому вам придется преобразовать это. Но это не должно быть слишком по-другому. Возможно, вам придется изменить \( на ( (в зависимости от синтаксиса). Также я не уверен, как .NET обрабатывает обратные ссылки, но это должны быть $1 и $2 (как в Java).

Примечание: я НЕ проверял это!

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