Regular Expression To Match String Not Starting Wi

2019-02-26 11:34发布

问题:

I need a regular expression that makes sure a string does not start with or end with a space. I don't care if it has a space in the "middle" just not at the beginning or the end.

I have a regular expression that almost works:

^\S.*\S$

Here are some example results:

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

As you can see, the issue I am having is that when the string is only 1 character long ("H" in the example above) it doesn't return a match.

How do I modify my regular expression to handle the case where the string length is 1?

Thank you

NOTE - I am saving this data to an Xml file so I need a pattern to match the same thing in Xml schema. I am not sure if it's the same as whatever Regex in C# uses or not.

If anyone could provide me with the pattern to use in my schema that would be greatly appreciated!

回答1:

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.



回答2:

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