我有以下字符串
" 98225-2077 Bellingham WA"
我需要使用正则表达式来分隔邮政编码,城市和州。 团体应该回来 (98225-2077)(贝灵厄姆)和(WA)。 国家是可选的,总是在最后,由两个大写字符组成。
我可以使用正则表达式
过滤掉以下内容邮政编码:(^([\S]+-)?\d+(-\d+)?)
- 组[1]
城市:((^([\S]+-)?\d+(-\d+)?)\s)?(\S.*)
=群组[5]。
是否有一个正则表达式可以使用相同的正则表达式过滤掉所有三个正则表达式并在状态不存在时返回空白?
答案 0 :(得分:0)
我会选择将字符串拆分为空格,然后根据需要使用各个部分。因为您的城市名称可能包含多个单词,所以我会从第二个元素迭代到倒数第二个元素来构建城市名称。此解决方案假定邮政编码和州两个缩写将始终为单个单词。
MenuItem mnu = new MenuItem();
// if mnu has sub item(s)
mnu.Selectable = false;
答案 1 :(得分:0)
容易!
^([\d-]+)\s+(.+?)\s*([A-Z]{2})?$
https://regex101.com/r/tL4tN5/1
说明:
^([\d-]+)
:^
用于字符串的开头。数字\d
\s+(.+?)\s*
:获取邮政编码和州([A-Z]{2})?$
:{2}
表示指定范围[A-Z]
中的2个字符。 ?
表示它存在1次或0次。答案 2 :(得分:0)
答案 3 :(得分:0)
我真的认为你可以在没有正则表达式的情况下做到这一点。这有两个解决方案:
非正则表达式解决方案:
/// <summary>
/// Split address into ZIP, Description/Street/anything, [A-Z]{2} state
/// </summary>
/// <returns>null if no space is found</returns>
public static List<string> SplitZipAnyStateAddress(this string s)
{
if (!s.Contains(' ')) return null;
var zip = s.Substring(0, s.IndexOf(' '));
var state = s.Substring(s.LastIndexOf(' ') + 1);
var middle = s.Substring(zip.Length + 1, s.Length - state.Length - zip.Length - 2);
return state.Length == 2 && state.All(p => Char.IsUpper(p)) ?
new List<string>() { zip, middle, state } :
new List<string>() { zip, string.Format("{0} {1}", middle, state) };
}
结果:
StringRegUtils.SplitZipAnyStateAddress("98225-2077 Bellingham WA");
// => [0] 98225-2077 [1] Bellingham [2] WA
StringRegUtils.SplitZipAnyStateAddress("98225-2077 Bellin gham");
// => [0] 98225-2077 [1] Bellin gham
StringRegUtils.SplitZipAnyStateAddress("98225-2077 New Delhi CA");
// => [0] 98225-2077 [1] New Delhi [2] CA
<强> REGEX 强>
如果没有,你可以使用我的初始正则表达式建议(我认为?
丢失了):
^(?<zip>\d+-\d+)\s+(?<city>.*?)(?:\s+(?<state>[A-Z]{2}))?$
请参阅regex demo
详细说明:
^
- 字符串开头(?<zip>\d+-\d+)
- 1+位数后跟-
后跟1位数字\s+
- 1+空格(?<city>.*?)
- 除了换行符之外的0 +字符尽可能少到(?:\s+(?<state>[A-Z]{2}))?
- 可选(1或0)次出现
\s+
- 1+空格(?<state>[A-Z]{2})
- 正好是2个大写ASCII字母$
- 字符串结尾