用于在XML节点中捕获值的正则表达式。

时间:2015-07-24 13:42:56

标签: regex

我正在尝试提出一个正则表达式,它可以从格式化为XML的字符串中提取值,但是在CDATA标记内。字符串如下所示:

<OAORNO>1234546qwerty</OAORNO><OBITNO>12345-qwerty</OBITNO><OBITDS>123456 qwerty</OBITDS>

值可以是数字,单词字符,特殊字符和空格。或者那些的任何组合。所以我需要一个适合所有模式。

我有一个字符串拆分转换器,它接受正则表达式作为参数。转换器将根据您提供的参数拆分sting,并将字符串作为数组返回。然后,我将显示为列表。

然而,我正在尝试创建一个适合所有正则表达式的时间以满足我的需要。

我提出的最接近的模式是:

(?<=\>)(.+)(?=\<)

但这会捕获第一个和最后一个节点之间的所有内容。因此,从上面的示例中,它可以抓取所有内容,因此最终得到:

1234546qwerty</OAORNO><OBITNO>12345-qwerty</OBITNO><OBITDS>123456 qwerty

必须有办法做到这一点,任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

默认情况下+是贪婪的,这意味着它会尽可能多地捕获。您可以将其设置为非贪婪,以便通过在其后添加?来捕获尽可能短的匹配,如下所示:(?<=\>)(.+?)(?=\<)

但是,您的模式还有另一个问题。 .+?将匹配任何内容,包括直接<字符,因此当元素中没有文本时,它会捕获太多。在这种情况下,像(?<=\>)([^<]+?)(?=\<)这样的东西会更好。

答案 1 :(得分:0)

与Regex转换器类似,您可以使用转换器获取XML片段并将其转换为XElement。这将让你bind to the XML Document

<Grid.Resources>
    <local:XmlFragmentConverter x:Key="xElementConverter" />
</Grid.Resources>
<TextBox x:Name="xmlTb" Text="&lt;OAORNO&gt;1234546qwerty&lt;/OAORNO&gt;&lt;OBITNO&gt;12345-qwerty&lt;/OBITNO&gt;&lt;OBITDS&gt;123456 qwerty&lt;/OBITDS&gt;" Margin="10,10,322,286" Height="23" />

<ListBox HorizontalAlignment="Left" Height="100" Margin="10,38,0,0" VerticalAlignment="Top" Width="185" 
            DataContext="{Binding ElementName=xmlTb, Path=Text, Converter={StaticResource xElementConverter}}" 
            ItemsSource="{Binding Path=Elements}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding Path=Name,Mode=OneWay}" /><Run Text=": "/><Run Text="{Binding Path=Value, Mode=OneWay}" />
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<ListBox HorizontalAlignment="Left" Height="100" Margin="10,143,0,0" VerticalAlignment="Top" Width="185" 
    DataContext="{Binding Text, Converter={StaticResource xElementConverter}, ElementName=xmlTb}" 
    ItemsSource="{Binding Elements[OBITNO]}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock><Run Text="{Binding Name, Mode=OneWay}" /><Run Text=": "/><Run Text="{Binding Value, Mode=OneWay}" /></TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

产地:

Demo showing a binding to the xml data

转换器:

sealed class XmlFragmentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return null;
        }

        var xmlString = value as string;
        if (string.IsNullOrWhiteSpace(xmlString))
        {
            throw new ArgumentException("value must be a string containing xml data", "value");
        }

        return XDocument.Parse("<root>" + xmlString + "</root>").Root;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}