Regular Expression To Match String Not Starting With Or Ending With Spaces

吃可爱长大的小学妹 提交于 2019-12-02 02:10:19

You could do this:

^\S(.*\S)?$

It will match either a single non space character, followed by an optional zero-or-more characters followed by a single non space character.


Update

Given that you said this was for XML schema validation I tested it with this schema:

<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>

Against this sample document

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

So it appears that if you simply remove the start / end brackets. It works.

You use lookaround assertions, because they're zero-width:

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

It might be better to use negative assertions and positive character classes, though:

^(?!\s).*(?<=\s)$
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!