我正在尝试提出一个正则表达式,它可以从格式化为XML的字符串中提取值,但是在CDATA标记内。字符串如下所示:
<OAORNO>1234546qwerty</OAORNO><OBITNO>12345-qwerty</OBITNO><OBITDS>123456 qwerty</OBITDS>
值可以是数字,单词字符,特殊字符和空格。或者那些的任何组合。所以我需要一个适合所有模式。
我有一个字符串拆分转换器,它接受正则表达式作为参数。转换器将根据您提供的参数拆分sting,并将字符串作为数组返回。然后,我将显示为列表。
然而,我正在尝试创建一个适合所有正则表达式的时间以满足我的需要。
我提出的最接近的模式是:
(?<=\>)(.+)(?=\<)
但这会捕获第一个和最后一个节点之间的所有内容。因此,从上面的示例中,它可以抓取所有内容,因此最终得到:
1234546qwerty</OAORNO><OBITNO>12345-qwerty</OBITNO><OBITDS>123456 qwerty
必须有办法做到这一点,任何帮助将不胜感激!
答案 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="<OAORNO>1234546qwerty</OAORNO><OBITNO>12345-qwerty</OBITNO><OBITDS>123456 qwerty</OBITDS>" 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>
产地:
转换器:
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();
}
}