Вот что вы регулярное выражение выглядит, глядя на него через automaton:
Таким образом, вы на самом деле правильно сопоставляете то, что хотите, но вы также захватываете две группы:
"<!ELEMENT note (to,from,body)"
"note"
, но он также будет соответствовать другой вид строки, как:
<!ELEMENT%e
(jmopV|)
<!ELEMENT r()
, которые не являются хорошо сформированными тегами.
Так что лучше хотите сделать more precise regex , как:
<!ELEMENT\s+\w+\s+\((\w+, ?)*\w+\)>
- вот то, что регулярное выражение соответствует:
- текст
<!ELEMENT
\s+
один или больше пространства
\w+
один или несколько слов характер
\s+
один или больше пространства
\(
реальная скобка
(
начало группы
\w+
или более в слове характер
,
запятая
?
один или нулевое пространство (может be *
ноль или более пробелов)
)*
конец группы, что gro до подкрепляются ноль или более раз
\w+
один или более в слове характер
- (вы можете добавить
\s*
, если вы хотите, чтобы соответствовать дополнительные пробелы перед закрывающей скобкой)
\)
закрывающая скобка характер
- (вы можете добавить
\s*
, если вы хотите, чтобы соответствовать дополнительные пробелы до конца тега)
>
закрывающий тег персонажа
Затем, когда вы делаете match(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i)
, вы все равно получите две группы:
"<!ELEMENT note (to,from,body)>"
"from,"
и вы должны получить первую группу, вам просто нужно получить первый элемент возвращаемого массива:
var match = "<!ELEMENT note (to,from,body)>".match(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i);
if (match !== null)
match = match[0];
и если вы хотите использовать объект регулярного выражения, чтобы сделать так:
pattern = new RegExp(/<!ELEMENT\s+\w+\s+\((\w+, *)*\w+\)>/i)
match = pattern.exec(text)
if (match !== null)
match = match[0]
, что поможет вам первую группу матча (который является полное совпадение).
ПОСЛЕ EDIT:
вы хотите регулярное выражение, которое работает на этом множестве значений:
<!ENTITY Aring "&#197;" >,
<!ENTITY aring "&#229;" >,
<!ENTITY agrave "&#224;" >,
<!ENTITY aacute "&#225;" >,
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>,
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>,
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>,
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>,
<!ELEMENT note (to,from,heading,body)>,
<!ELEMENT to (#PCDATA)>,
<!ELEMENT from (#PCDATA)>,
<!ELEMENT heading (#PCDATA)>,
<!ELEMENT body (#PCDATA)>
так что вы хотите регулярное выражение, которое выглядит как этот:
/<!ELEMENT\s+\w+\s+\((\#?\w+,\s*)*\#?\w+\s*\)\s*>/
look it up here
var match = "<!ELEMENT note (to,from,body)>".match(/<!ELEMENT\s+\w+\s+\((\#?\w+,\s*)*\#?\w+\s*\)\s*>/i);
if (match !== null)
match = match[0];
там соответствует только <!ELEMENT...
узлы, а не <!ATTLIST...
или <!ENTITY...
узлов. Для них match
будет равно null
. Для узлов <!ELEMENT...
они будут содержать полную строку совпадающего узла.
Итак, вы хотите только совместить «(to, from, body)»? Требуется ли элемент примечания? –
Я хочу сопоставить весь узел, если он правильно отформатирован ... или любой узел подобной структуры, поэтому результатом в этом случае будет и null, если оригинальный струна был например. – user1360809
Покажите нам, как вы используете это регулярное выражение - он работает. Что * * хотел? – Bergi