Регулярное выражение для сопоставления строки, не начинающейся или не заканчивающейся пробелами

Мне нужно регулярное выражение, которое гарантирует, что строка не начинается и не заканчивается пробелом. Мне все равно, есть ли место в "середине", только не в начале или в конце.

У меня есть регулярное выражение, которое почти работает:

^\S.*\S$

Вот несколько примеров результатов:

"HELLO" (Match)
"HEL LO" (Match)
" HELLO" (No Match)
"HELLO " (No Match)
"H" (No Match)

Как видите, проблема, с которой я сталкиваюсь, заключается в том, что когда длина строки составляет всего 1 символ ("H" в приведенном выше примере), она не возвращает совпадение.

Как мне изменить мое регулярное выражение для обработки случая, когда длина строки равна 1?

Спасибо

ПРИМЕЧАНИЕ. - Я сохраняю эти данные в XML-файле, поэтому мне нужен шаблон для сопоставления того же самого в XML-схеме. Я не уверен, что это то же самое, что использует Regex в C# или нет.

Если бы кто-нибудь мог предоставить мне шаблон для использования в моей схеме, это было бы очень признательно!

2 ответа

Решение

Вы могли бы сделать это:

^\S(.*\S)?$

Он будет соответствовать либо одному непробельному символу, за которым следует необязательный ноль или более символов, за которым следует один непробельный символ.


Обновить

Учитывая, что вы сказали, что это для проверки схемы XML, я проверил это с этой схемой:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="xml">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="test" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="value">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:pattern value="\S(.*\S)?"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Против этого образца документа

<xml>
  <test value="HELLO"/>    <!-- MATCH -->
  <test value="HEL LO"/>   <!-- MATCH -->
  <test value="HELLO "/>   <!-- ERROR -->
  <test value=" HELLO"/>   <!-- ERROR -->
  <test value="H"/>        <!-- MATCH -->
</xml>

Так что получается, что если вы просто удалите начальные / конечные скобки. Оно работает.

Вы используете косвенные утверждения, потому что они имеют нулевую ширину:

^(?=\S).*(?<=\S)$

Хотя, возможно, лучше использовать отрицательные утверждения и классы положительных символов:

^(?!\s).*(?<=\s)$
Другие вопросы по тегам