Tirthankar Dutta Ответов: 2

Как найти буквенно-цифровое слово из строки с помощью регулярного выражения?


Получите скидку 20% на весь ваш заказ и бесплатную доставку (только для первых клиентов)! Введите код купона NEW20VISION при оформлении заказа. Предложение ограничено по времени.

Цитата:
Я получаю этот тип строки из БД.Мне нужно выяснить, есть ли в строке буквенно-цифровое слово.Если он содержит какое-либо буквенно-цифровое слово.Я это уже подчеркивал.Как и в приведенном выше случае, это:NEW20VISION

Sandeep Mewara

Хорошо. А что вы уже пробовали до сих пор?

Tirthankar Dutta

Я пробовал регулярное выражение типа @"^[a-zA-Z0-9]\s*$";

VJ Reddy

Спасибо, что приняли это решение :)

2 Ответов

Рейтинг:
5

VJ Reddy

Решение 1 дано по формуле Рдбурмон очень хороший.

В качестве альтернативы для поиска буквенно-цифровых слов можно использовать следующее регулярное выражение. Сначала он ищет слово с 2 или более буквенно-цифровыми символами, затем проверяет, присутствует ли в искомом слове хотя бы одна цифра и хотя бы один символ, и только в этом случае слово будет захвачено как группа.

В дальнейшем захваченная группа может быть использована для замены. Например. каждое из захваченных слов может быть заключено в <u> и </u>, как показано ниже:

То Regular Expression можно протестировать здесь http://regexhero.net/tester/[^]

string inputText = @"Get 20% Off Your Entire Order & FREE Shipping " +
       @"(first time customers only)! Enter coupon code NEW20VISION at checkout." +
       @"Limited time offer. NEW20 20VISION  New20New20New20Ne20  N2";

MatchCollection alphaNumMatches = Regex.Matches(inputText,
       @"(?=\w{2,})(?=\w*\d+)(?=\w*\p{L}+)(\w{2,})",
       RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

foreach(Match match in alphaNumMatches){
    if (match.Groups.Count > 0)
        Console.WriteLine (match.Groups[1].Value);
}

string replacedText = Regex.Replace(inputText,
       @"(?=\w{2,})(?=\w*\d+)(?=\w*\p{L}+)(\w{2,})",
       @"<u>$1</u>");

Console.WriteLine (replacedText);

//Output

//NEW20VISION
//NEW20
//20VISION
//New20New20New20Ne20
//N2
//Get 20% Off Your Entire Order & FREE Shipping (first time customers only)! Enter coupon code <u>NEW20VISION</u> at checkout.Limited time offer. <u>NEW20</u> <u>20VISION</u>  <u>New20New20New20Ne20</u>  <u>N2</u>


Maciej Los

Чтобы найти все слова, содержащие числа, правильный шаблон является: \w*([0-9]+)\w*

VJ Reddy

Это правда. Но он проверяет, чтобы увидеть, что по крайней мере одна цифра есть в искомом слове, но не гарантирует, что по крайней мере один алфавит есть в поиске. Например, этот шаблон соответствует 20 в приведенном выше тексте, в то время как ОП хочет, чтобы слово содержало по крайней мере одну цифру и по крайней мере один алфавит, как я понимаю из слова буквенно-цифровой. Вот тут-то и возникает проблема.
Это интересно. Узор короткий. Если его можно изменить, чтобы дать хотя бы один алфавит и одну цифру в матче, то я думаю, что это будет хорошо.
Спасибо.

Рейтинг:
14

RDBurmon

Попробовать это

string s = TextBox1.Text;
string str = "";
string[] words = s.Split(' ');
foreach (string word in words)
{
    Regex r = new Regex("[a-zA-Z]");

    if (r.IsMatch(word))
    {
        Regex r1 = new Regex("[0-9]");
        if (r1.IsMatch(word))
        {
          str=str +  " " + "<U>" +  word + "</U>";
        }
        else
            str=str +  " " + "" +  word + "";
    }
    else
            str=str +  " " + "" +  word + "";
}

Label1.Text=str;


Надеюсь, что это поможет, если да, то примите и проголосуйте за ответ, иначе вернитесь обратно с вашими запросами.
--Рдбурмон Старший Инженер-Программист


Rahul Rajat Singh

Я не специалист по регулярным выражениям, но мне кажется, что первое условие if потерпит неудачу для требуемых слов, которые мы хотим, и вся логика, чтобы найти их, находится только внутри этого условия. Я могу ошибаться, пожалуйста, поправьте меня, если я ошибаюсь.

Rahul Rajat Singh

Но я ошибся. это идеальное решение. Я попробовал этот вариант, и он отлично сработал. +5 от меня.


static void Main(string[] args)
{
строка s = @"получите скидку 20% на весь ваш заказ и бесплатную доставку (только для первых клиентов)! Введите код купона NEW20VISION при оформлении заказа. Предложение ограничено по времени. ";
строка str = "";
строка[] слова = С. Сплит(' ');
FoundWords коллекции = новый ArrayList();

по каждому элементу (строка, слова в слова)
{
Регулярное выражение r = новое регулярное выражение("[a-zA-Z]");

если (Р.Выполняется(слово))
{
Регулярное выражение r1 = новое регулярное выражение("[0-9]");
если (Р1.Выполняется(слово))
{
найденные слова.Добавить(слово);
}
}
}

foreach (string strr в найденных словах)
{
Приставка.WriteLine(strr);
}
}

RDBurmon

Спасибо
Тиртханкар-Датта : попробуйте код выше и дайте нам знать .

Tirthankar Dutta

Спасибо всем.Он работал

VJ Reddy

Хороший ответ. 5!

Maciej Los

Чтобы найти все слова, содержащие числа, правильный шаблон является: \w*([0-9]+)\w*