Это будет работать:
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
Символ ?
означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s)
будет соответствовать символу -
или |
. Добавление ?
после второго появления этой группы в вашем регулярном выражении позволяет вам сопоставить последовательность из десяти последовательных цифр.
Примерно так (проверено):
Dim questions As MSXML2.IXMLDOMNodeList, question As MSXML2.IXMLDOMNode
Dim genre
Set questions = oXMLFile.SelectNodes("/catalog/query")
For Each question In questions
genre = ChildValue(question, "genre")
If Len(genre) > 0 Then
With eWorkbook.Sheets(genre).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
.Cells(1).Value = ChildValue(question, "question")
.Cells(2).Value = ChildValue(question, "answer")
.Cells(3).Value = ChildValue(question, "comment")
End With
End If
Next question
Утилита для получения значений дочерних узлов:
Function ChildValue(n As MSXML2.IXMLDOMNode, childName As String)
Dim el, rv
Set el = n.SelectSingleNode(childName)
If Not el Is Nothing Then rv = el.nodeTypedValue
ChildValue = rv
End Function