新規作成日 2017-01-28
最終更新日
部分文字列が取得したい
以前に、URLを指定して静的サイトのHTMLテキストを取得し(動的サイトには対応していません)、正規表現文字列を使って必要な文字列取り出すアプリケーションを作成しました。
C# のWPFアプリケーションで、インターネット上のhtmlファイルを読み込んで、必要な情報だけを取得する。
URLを指定して静的サイトのHTMLテキストを取得し(動的サイトには対応していません)、正規表現文字列を使って必要な文字列取り出すアプリケーションを作成します。 HTMLてキストから、必要な文字列を取り出すための正規表現文字列を探し出す際に活用することができます。デフォルトでは、aタグ全体を取り出します。
このページで紹介したプログラムの元となるプログラムです。
このプログラムでは、部分一致が使えません。
そこで、手を加えて、
そこで、手を加えて、正規表現の完全一致だけでなく、部分一致にも対応したプログラムに修正します。
正規表現パターンの取り出したい部分をグループ化を示す"(",")" で囲みます。
class DoRegex
{
// 正規表現パターンを格納
public string regexPattern;
// 取得した一致パターンを格納
public string RegexResult;
public DoRegex(string pattern, string targetStr)
{
Regex r = new Regex(pattern);
Match m = r.Match(targetStr);
while (m.Success)
{
RegexResult = RegexResult + m.Groups[1] + "\n";
m = m.NextMatch();
}
}
}
GetWeb.csファイルは、以下のように修正します。
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
namespace WebRegex02
{
class GetHtmlTexte
{
// 取得したhtmlテキスト
public string result;
// コンストラクタ urlを与えると、resultにhtmlテキストを入力する
public GetHtmlTexte(string url)
{
WebClient wc = new WebClient();
try
{
using (Stream stream = wc.OpenRead(url))
using (StreamReader sr = new StreamReader(stream))
{
// Add a user agent header in case the
// requested URI contains a query.
// 要求されたURIに、問合せが含まれる場合に備えて、
// ユーザー・エージェント・ヘッダを追加します。
wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
string str = sr.ReadToEnd();
result = str;
}
}
catch
{
// Let the user know what went wrong.
// ユーザーに、何が問題になったのかを知らせます。
// The file could not be read:
result = "指定されたサイトを読み取れませんでした:";
}
}
}
class DoRegexParts
{
// 部分一致 1つ目のグループを取得
// 正規表現パターンを格納
public string regexPattern;
// 取得した一致パターンを格納
public string RegexResult;
public DoRegexParts(string pattern, string targetStr)
{
Regex r = new Regex(pattern);
Match m = r.Match(targetStr);
while (m.Success)
{
RegexResult = RegexResult + m.Groups[1] + "\n";
m = m.NextMatch();
}
}
}
class DoRegex
{
// 一致を取得
// 正規表現パターンを格納
public string regexPattern;
// 取得した一致パターンを格納
public string RegexResult;
public DoRegex(string pattern, string targetStr)
{
Regex r = new Regex(pattern);
Match m = r.Match(targetStr);
while (m.Success)
{
RegexResult = RegexResult + m.Value + "\n";
m = m.NextMatch();
}
}
}
}
MainWindow.xamlを以下コードを参考に変更します。
<Window x:Class="WebRegex02.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WebRegex02"
Title="MainWindow" Height="400" Width="600">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Name="targetURL" Grid.Row="0">
<DockPanel DockPanel.Dock="Top">
<Button Name="urlAcsses"
DockPanel.Dock="Right"
Width="100"
Click="urlAcsses_Click">html取得</Button>
<TextBox Name="urlAdress">TextBox</TextBox>
</DockPanel>
<TextBox Name="htmlText"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto">TextBox</TextBox>
</DockPanel>
<GridSplitter Grid.Row="1" Height="2" HorizontalAlignment="Stretch" />
<DockPanel Grid.Row="2">
<DockPanel DockPanel.Dock="Top">
<Button Name="doRegex"
DockPanel.Dock="Right"
Width="70"
Click="doRegex_Click">一致</Button>
<Button Name="doRegexParts"
DockPanel.Dock="Right"
Width="70"
Click="doRegexParts_Click">部分一致</Button>
<TextBox Name="regexFormula">TextBox</TextBox>
</DockPanel>
<TextBox Name="regexResult"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto">TextBox</TextBox>
</DockPanel>
</Grid>
</Window>
MainWindow.xaml.csを以下コードを参考に変更します。
using System.Windows;
namespace WebRegex02
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
urlAdress.Text = "https://webdesign.vdlz.xyz/index.html";
regexFormula.Text = "<a href=\"(.*?)\".*?>";
}
private void urlAcsses_Click(object sender, RoutedEventArgs e)
{
string url = urlAdress.Text;
GetHtmlTexte gethtml = new GetHtmlTexte(url);
htmlText.Text = gethtml.result;
}
private void doRegex_Click(object sender, RoutedEventArgs e)
{
string rPattern = regexFormula.Text;
DoRegex RResult = new DoRegex(rPattern, htmlText.Text);
regexResult.Text = RResult.RegexResult;
}
private void doRegexParts_Click(object sender, RoutedEventArgs e)
{
string rPattern = regexFormula.Text;
DoRegexParts RResult = new DoRegexParts(rPattern, htmlText.Text);
regexResult.Text = RResult.RegexResult;
}
}
}
htmlテキストを取得し、正規表現パターンに従ってテキストを取り出します。1つ目のグループにしか対応していませんので、必要に応じて修正して下さい。