我有以下正则表达式情况: 字符串是字母,数字和点的特定组合。但是,如果每个出现的点至少有一个前置字母,则只应匹配该字符串。 以下示例必须有效:
123f.12ed.ad2d
1s.2s.2d.3wd.fw.e.ss.asda
12312vsd
dss.
这些应无效:
as2.
..ad2
2.12as.
.ad2ads
我尝试过使用lookbehind,但它不能像我需要的那样工作。它验证了无效的字符串。
^[a-z0-9\.]*(?<=[a-z])\.*$
答案 0 :(得分:1)
你的正则表达式可以在任何地方允许点。你需要限制它们。
^[a-z0-9]*([a-z]\.[a-z0-9]*)*$
所以,没有点的任何东西都可以。然后必须至少有一个字母后跟一个点,然后基本上重复相同的模式任意次。
&#34; a *(ba *)*&#34;高级模式是典型的&#34; a *,可选b:s嵌入&#34; (或者你可以转过来说'#34;(a * b)* a *&#34;)。
你的尝试会允许任何事情,然后在单个字母后面跟踪;但看起来你误解了后视。无论如何,这里确实没有必要。
也许是一个带有&#34;铁路的正则表达式可视化工具&#34;图形可以帮助你掌握正则表达式。例如,尝试https://www.debuggex.com/r/hnpp_ev2utNlZbQC。
答案 1 :(得分:1)
这种基于lookbehind的正则表达式应该可以工作:
^(?:[^.]*(?<=[a-zA-Z])\.)*[^.]*$
否则
^(?:[A-Za-z0-9]*(?<=[a-zA-Z])\.)*[A-Za-z0-9]*$
答案 2 :(得分:0)
一种简单的方法是测试字符串是否一个点前面没有字母以排除它:
[^a-z]\.|\A\.
如果模式失败,则字符串有效。