我需要一个正则表达式开头,并以

时间:2016-04-07 05:59:24

标签: regex

我正在寻找一个正则表达式来定位众多表达式来查找和替换。表达式看起来像s360a__fieldname__c。我需要找到s360a__后跟__c的所有实例。

问题是它必须在一行内,所以它找不到起始的s360a__,然后是下一个__c,可能是下面的几行。

以下是我正在更改的一些xml的示例。

<fields>
    <fullName>s360a__AddressPreferredStreetAddressCity__c</fullName>
    <deprecated>false</deprecated>
    <externalId>false</externalId>
    <label>Preferred Street City</label>
    <length>255</length>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <trackHistory>false</trackHistory>
    <type>Text</type>
    <unique>false</unique>
</fields>
<fields>
    <fullName>s360a__AddressPreferredStreetAddressCountry__c</fullName>
    <deprecated>false</deprecated>
    <externalId>false</externalId>
    <label>Preferred Street Country</label>
    <picklist>

1 个答案:

答案 0 :(得分:0)

您最好使用解析器,而不是xpath。以下是PHP的示例(例如Python也可以轻松采用)。我们的想法是加载DOM,然后使用函数过滤掉元素(在此示例中为starts-with()text()):

<?php
$xml = '<fields>
    <fullName>s360a__AddressPreferredStreetAddressCity__c</fullName>
    <deprecated>false</deprecated>
    <externalId>false</externalId>
    <label>Preferred Street City</label>
    <length>255</length>
    <required>false</required>
    <trackFeedHistory>false</trackFeedHistory>
    <trackHistory>false</trackHistory>
    <type>Text</type>
    <unique>false</unique>
</fields>';

$dom = simplexml_load_string($xml);
// find everything where the text starts with 's360a_'
$fields = $dom->xpath("//*[starts-with(text(), 's360a_')]");
print_r($fields);
# s360a__AddressPreferredStreetAddressCity__c

代码检查文本是否以s360a_开头。要使用某个特定字符串实际检查它是否结束,您需要fiddle quite a bit(因为尚不支持相应的函数ends-with())。

# check if the node text starts and ends with a specific string     
$fields = $dom->xpath("//*[starts-with(., 's360a_') and substring(text(), string-length(text()) - string-length('_c') +1) = '_c']");
?>