Как найти более одного значения в строке, используя регулярное выражение - PullRequest
0 голосов
/ 06 июля 2011

Привет, я хочу выделить целое золотое кольцо для этого я делаю как

var match = hitem.text[0].match(/<em>(.*?)<\/em>/);
where hitem.text[0]=<em>Gold</em> <em>Ring</em>

, но проблема в том, что var match получает только золото, поэтому я могу выделить только золото, я хочу сделать его массивом, чтобы он содержал и золото, и кольцо, как я могу это сделать. посмотрите здесь http: http://jsfiddle.net/bhXbh/4/

Ответы [ 4 ]

0 голосов
/ 06 июля 2011

.NET Framework содержит специальный класс, который вы можете использовать для своей цели - класс MatchCollection.

Пример из MSDN :

using System;
using System.Text.RegularExpressions;

public class Test
{

    public static void Main ()
    {

        // Define a regular expression for repeated words.
        Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
          RegexOptions.Compiled | RegexOptions.IgnoreCase);

        // Define a test string.        
        string text = "The the quick brown fox  fox jumped over the lazy dog dog.";

        // Find matches.
        MatchCollection matches = rx.Matches(text);

        // Report the number of matches found.
        Console.WriteLine("{0} matches found in:\n   {1}", 
                          matches.Count, 
                          text);

        // Report on each match.
        foreach (Match match in matches)
        {
            GroupCollection groups = match.Groups;
            Console.WriteLine("'{0}' repeated at positions {1} and {2}",  
                              groups["word"].Value, 
                              groups[0].Index, 
                              groups[1].Index);
        }

    }

}
// The example produces the following output to the console:
//       3 matches found in:
//          The the quick brown fox  fox jumped over the lazy dog dog.
//       'The' repeated at positions 0 and 4
//       'fox' repeated at positions 20 and 25
//       'dog' repeated at positions 50 and 54
0 голосов
/ 06 июля 2011

Вы захотите перебрать все совпадения с помощью метода exec объектов регулярного выражения, а затем сохранить первую обратную ссылку в массив. Также обратите внимание на флаг /g, который делает ваше регулярное выражение глобальным, то есть настроенным на захват всех совпадений, а не только первого:

var str = "<em>Gold</em> <em>Ring</em>";
var matches = [];
var re = /<em>(.*?)<\/em>/g;
while (match = re.exec(str)) { // Continues until no more matches are found
  matches.push(match[1]);      // Adds the first backreference
}
console.log(matches);          // returns ["Gold", "Ring"]

Если вы хотите объединить matches в строку, конечно, вы можете сделать matches.join(" ");.

Другие опции

Если вы не возражаете захватить окружающие теги <em>, вы можете сделать var matches = str.match(re);.

А если вы просто хотите заменить теги <em>, вы можете сделать str.replace(re, "$1");.

0 голосов
/ 06 июля 2011
var s = "<em>Gold</em> <em>Ring</em>";
var rg = /<em>(.*?)<\/em>/g;

var res = new Array();

var match = rg.exec(s);
while(match != null){
    res.push(match[1])
    match = rg.exec(s);
}

alert(res);
0 голосов
/ 06 июля 2011

Добавьте модификатор global к своему регулярному выражению, например:

var match = hitem.text[0].match(/<em>(.*?)<\/em>/ig);

(я также добавил «i», что означает «игнорировать регистр», я полагаю, это также необходимо)

http://jsfiddle.net/bhXbh/19/

...