问题
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)$
来源:https://stackoverflow.com/questions/17768298/regular-expression-to-match-string-not-starting-with-or-ending-with-spaces