2010-09-14 2 views
0

Моя коллега нуждается в том, чтобы я написал ему регулярное выражение для своего приложения vb.net.Как написать это регулярное выражение в VB.net?

Я не знаю vb, и он не знает регулярное выражение.

Регулярное выражение он нуждается:

/.*web id: ?(\d+).*/i 

В принципе он должен искать строку что-то вроде «веб-ID: 345» или «веб-ID: 2534» и получить идентификатор.

Он взял то, что я дал ему выше, и был в состоянии поставить это вместе:

Dim strPattern As String = ".*web id: ?(\d+).*" 
Dim strReplacement$ = "$1" 

GetWebId$ = Regex.Replace(LCase$(strNote$), strPattern$, strReplacement$) 

Однако я не уверен, как вы передадите флаг в регистронезависимое? (его текущее исправление для этого делает первую строчку в нижнем регистре)

Также одна вещь, которую я не могу понять, - это когда он запускает это на строке с несколькими строками, любой текст, который не находится на одной строке как «id: \ d» также возвращается, что я нахожу странным.

ответ

3

Используйте RegexOptions.IgnoreCase флаг:

Regex.Replace(strNote, strPattern, strReplacement, RegexOptions.IgnoreCase) 

Если вы собираетесь игнорировать дело не должно быть никакой необходимости использовать LCase. Мне также показалось странным, что у вас есть все эти символы $ в именах переменных - они не должны быть действительными ни на C#, ни на VB.NET.


РЕДАКТИРОВАТЬ # 2: Я понимаю, что вы, возможно, захотели заменить всю линию, которая соответствует шаблону замены $1, чтобы соответствовать ID. Если у вас есть необходимость использовать несколько вариантов вы можете Or их вместе следующим образом:

Regex.Replace(input, pattern, replacement, RegexOptions.IgnoreCase Or RegexOptions.Singleline) 

EDIT # 1: вы используете неправильный метод для извлечения ID. У вас есть группа (\d+) для захвата идентификатора, но вы используете Regex.Replace в своем матче, поэтому вы получаете все остальное в тексте. Для того, чтобы соответствовать ID использовать следующие:

Dim input As String = "foo web id:2010 bar" 
Dim pattern As String = ".*web id: ?(\d+).*" 
Dim m As Match = Regex.Match(input, pattern, RegexOptions.IgnoreCase) 

If m.Success Then 
    Dim id As String = m.Groups(1).Value 
    Console.WriteLine("ID: " & id) 
Else 
    Console.WriteLine("No Match!") 
End If 

Вы заметите, мы имеем в виду Groups(1), которая удерживает значение, захваченное (\d+) группы. Шаблоны с большим количеством групп могут приводить к путанице, особенно с вложенными группами. В этих случаях вы можете использовать именованные группы. Вот тот же код обновляется для использования именованных групп:

Dim input As String = "foo web id:2010 bar" 
Dim pattern As String = ".*web id: ?(?<ID>\d+).*" ' group name added ' 
Dim m As Match = Regex.Match(input, pattern, RegexOptions.IgnoreCase) 

If m.Success Then 
    ' refer to group by group name ' 
    Dim id As String = m.Groups("ID").Value 
    Console.WriteLine("ID: " & id) 
Else 
    Console.WriteLine("No Match!") 
End If 
+0

Спасибо, моя большая проблема, хотя это было при запуске этого многострочного текста. –

+0

@ Джон вижу мои обновления. Если у вас все еще есть проблемы, пожалуйста, обновите свой пост с помощью некоторого примера ввода с текстом «многострочный». –

+0

Это делает именно то, что он хотел, спасибо! –

1

Вид несвязанных, но этот код представляет собой совокупность вещей, которые вы не должны делать в VB.NET.

Вы не должны использовать суффикс $ для строковых переменных, а также использовать старые функции, такие как LCase$. Существуют эквивалентные функции в рамках, которые следует использовать. Вы также можете сообщить своему другу, чтобы он всегда включал Option Strict, когда он у него. Это поймает много потенциальных ошибок.

Кроме того, чтобы установить возвращаемое значение функции, ... «более установленный» способ заключается в использовании Return …, а не Functionname = ….

Так что «правильный» код будет выглядеть следующим образом: решение

''// I’m assuming that `GetWebId` is the name of the function we’re in. 
Function GetWebId(note As String) As String 
    Dim pattern As String = ".*web id: ?(\d+).*" 
    Dim replacement As String = "$1" 
    Return Regex.Replace(note.ToLower(), pattern, replacement) 
End Function 

знакомства Ахмада о том, как получить «IgnoreCase» флаг в выражение.

+0

Спасибо, я обнаружил, что обрабатывал многострочный вопрос, который ему нужен, чтобы включить флаг «RegexOptions.Singline». Есть ли способ, которым он может пройти 2 варианта? –

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