<p>您的字段内容可能是:</p>
<ul>
<li>空的</li>
<li>整数<code>\d+</code></li>
<li>带引号的十进制数<code>"\d+,\d+"</code></li>
</ul>
<p>这可以表示为<code>(|\d+|"\d+,\d+")</code>。您需要其中三个,逗号分隔:</p>
<p><code>(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+")</code></p>
<p>(你可以用<code>(|\d+|"\d+,\d+")(,(|\d+|"\d+,\d+")){2}</code>来处理重复,但是同样的事情重复三次就更容易理解了)</p>
<p>请注意,这将假定最后一个字段为“空”,因为这足以匹配您的定义。因此,我们需要将其锚定到线路的起点和终点:</p>
<p><code>^(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+")$</code></p>
<p>这将仅与有效行匹配</p>
<p>根据您的解释,开头和结尾可能有额外的逗号,但没有其他字符,因此:</p>
<p><code>^,*(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),*$</code></p>
<>这与所有的线匹配,但不能给你真正关心的东西,中间的“好”部分。为此,可以使用组(使用括号)。但是,我们已经在使用组,用于<code>|</code>替代方案,因此我们需要添加<code>?:</code>以使它们不被捕获:</p>
<p><code>^,*(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),*$</code></p>
<p>现在,您可以将您关心的部分包装在捕获组中,为我们提供最终的regexp:</p>
<p><strong><code>^,*((?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+")),*$</code></strong></p>
<p>搜寻及;在regexp模式下,用此regexp替换搜索,用<code>\1</code>替换替换值</p>
<p>如果多个字段为空,则可能存在多个可能的解决方案。如果三个值中的第一个和最后一个值从不为空,则可以相应地调整regexp。如果是,这将选择一组有效值,这些值可能不是您想要的。例如,如果您有:</p>
<pre><code>,,1,"2,3",,
</code></pre>
<p>那么<code>,1,"2,3</code>(empty,1,2.3)和<code>1,"2,3",</code>(1,2.3,empty)都是可能的解决方案。默认情况下,您将得到第二个结果,因为<code>*</code>是贪婪的,即第一个<code>,*</code>将尝试“吃”尽可能多的逗号,而不会使匹配失败。您可以添加这样一个问号:<code>,*?</code>使匹配成为“懒惰”或“非贪婪”,那么它只需要使用所需数量的逗号(产生第一个结果)</p>