質問編集履歴

2

例を修正しました。

2019/07/02 10:09

投稿

myonkiti
myonkiti

スコア11

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,28 @@
1
1
  ### 前提・実現したいこと
2
+
3
+
2
4
 
3
5
  C#のRegexで正規表現を使ったマッチングをしたいと思っています。
4
6
 
7
+
8
+
5
- ルごとに処理を分けたいためどのルヒットしたかが知りたいです。
9
+ 下記の表のようなデタがあり入力デて一致し正規表現がどれなのを取得したいです。
10
+
11
+
12
+
13
+ |ID|正規表現|
14
+
15
+ |--:|:--:|
16
+
17
+ |1|宮*県|
18
+
19
+ |2|東京都|
20
+
21
+ |3|(京都|大阪)府|
22
+
23
+
24
+
25
+ データの数だけRegexを作って検索をすればよいですが、もう少しスマートなやり方が無いものかと思い、そもそも1つのRegexに複数Regexを一つにまとめてしまって、一致したルール自体を取得できれば良いのではと考えました。
6
26
 
7
27
  例えば、以下のようなことがしたいです。
8
28
 
@@ -10,31 +30,121 @@
10
30
 
11
31
  ■ルール
12
32
 
13
- (a(a|b)bc|efg|hij)
33
+ (宮*県)|(東京都)|((京都|大阪)府)
14
-
15
- >
16
34
 
17
35
  ■入力文
18
36
 
19
- abbc
37
+ 宮城県
20
38
 
21
- >
39
+ ■ヒットしたルール
22
40
 
23
- ■ヒットしたルール(欲しいもの)
24
-
25
- a(a|b)bc
41
+ 宮*県
26
42
 
27
43
 
28
44
 
29
45
  ### 試したこと
30
46
 
31
- 「又は」だけRegexを作って検索をればよいですが、ルール数が数百数千になので、ほとんど線形探索になってしまい、あまり正規表現で検索する意味がなくなってしまうと思っています。
47
+ データだけRegexを作する方法
32
48
 
33
- そのため1つのRegexに入れて、どのルールにヒットしたかが分かれば良いと思った次第です。
49
+ ```C#
34
50
 
35
51
 
36
52
 
53
+ public class RegDataClass
54
+
55
+ {
56
+
57
+ public int Id { set; get; }
58
+
59
+ public string RegexStr { set; get; }
60
+
61
+ }
62
+
63
+
64
+
65
+
66
+
67
+ class Program
68
+
69
+ {
70
+
71
+ static void Main(string[] args)
72
+
73
+ {
74
+
75
+ string inputText = "宮崎県";
76
+
77
+
78
+
37
- また、ルール内に「<num>」等を入れてGroupsなどで取得できるかと思うのですが、これで取得できるのは、入力文にマッチングした箇所の抽出であって、マッチングできたルールそのものではないので実現したいこととは違います。
79
+ List<RegDataClass> dataClasses = new List<RegDataClass>()
80
+
81
+ {
82
+
83
+ new RegDataClass()
84
+
85
+ {
86
+
87
+ Id=1,
88
+
89
+ RegexStr="宮.県",
90
+
91
+ },
92
+
93
+ new RegDataClass()
94
+
95
+ {
96
+
97
+ Id=2,
98
+
99
+ RegexStr="東京都",
100
+
101
+ },
102
+
103
+ new RegDataClass()
104
+
105
+ {
106
+
107
+ Id=3,
108
+
109
+ RegexStr="(京都|大阪)府",
110
+
111
+ }
112
+
113
+ };
114
+
115
+ List<Regex> regices = new List<Regex>();
116
+
117
+
118
+
119
+ for (int i = 0; i < dataClasses.Count; i++)
120
+
121
+ {
122
+
123
+ regices.Add(new Regex(dataClasses[i].RegexStr));
124
+
125
+ }
126
+
127
+
128
+
129
+ for (int i = 0; i < regices.Count; i++)
130
+
131
+ {
132
+
133
+ if (regices[i].IsMatch(inputText))
134
+
135
+ {
136
+
137
+ Console.WriteLine($"ID={i + 1}でヒット");
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ ```
38
148
 
39
149
 
40
150
 

1

例を修正しました。

2019/07/02 10:09

投稿

myonkiti
myonkiti

スコア11

test CHANGED
File without changes
test CHANGED
@@ -6,29 +6,23 @@
6
6
 
7
7
  例えば、以下のようなことがしたいです。
8
8
 
9
- ```
9
+ >
10
10
 
11
11
  ■ルール
12
12
 
13
- (abc|efg|hij|h.*h)
13
+ (a(a|b)bc|efg|hij)
14
14
 
15
-
15
+ >
16
16
 
17
17
  ■入力文
18
18
 
19
- hsrjabceh
19
+ abbc
20
20
 
21
-
21
+ >
22
22
 
23
23
  ■ヒットしたルール(欲しいもの)
24
24
 
25
- ・abc
25
+ ・a(a|b)bc
26
-
27
- ・h.*h
28
-
29
-
30
-
31
- ```
32
26
 
33
27
 
34
28