use regex::Regex;
fn main() {
let text = "CREATE TABLE users (
id integer,
name text,
age integer,
);";
println!("{}", text);
let table_re = Regex::new(r"(?i)create\s+table\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\((?s)(.*?)\)").unwrap();
if let Some(caps) = table_re.captures(text) {
let table_name = &caps[1];
let columns_str = &caps[2];
println!("table name: {}", table_name);
let column_re = Regex::new(r"(?i)([a-zA-Z_][a-zA-Z0-9_]*)\s+([a-zA-Z0-9()]+)").unwrap();
for line in columns_str.lines() {
if let Some(col_caps) = column_re.captures(line.trim()) {
let column_name = &col_caps[1];
let column_type = &col_caps[2];
println!(" column name: {}, type: {}", column_name, column_type);
}
}
} else {
println!("CREATE TABLE 文ではありません");
}
}
CREATE TABLE users (
id integer,
name text,
age integer,
);
table name: users
column name: id, type: integer
column name: name, type: text
column name: age, type: integer
これにprimary keyなどのconstrainも追加したい…
fn main() {
let text = "CREATE TABLE users (
id integer primarykey,
name text not null,
age integer
);";
println!("{}", text);
let table_re = Regex::new(r"(?is)create\s+table\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\((.*?)\)").unwrap();
if let Some(caps) = table_re.captures(text) {
let table_name = &caps[1];
let columns_str = &caps[2];
println!("table name: {}", table_name);
let column_re = Regex::new(r"(?i)^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s+([a-zA-Z0-9()]+)(?:\s+(.*))?[,]?$").unwrap();
for line in columns_str.lines() {
let line = line.trim();
if line.is_empty() {
continue;
}
if let Some(col_caps) = column_re.captures(line) {
let column_name = &col_caps[1];
let column_type = &col_caps[2];
let constraint = col_caps.get(3).map_or("", |m| m.as_str()).trim();
println!(" column name: {}, type: {}, constraint: {}", column_name, column_type, if constraint.is_empty() { "None" } else { constraint });
} else {
println!(" ignored row: {}", line);
}
}
} else {
println!("CREATE TABLE 文ではありません");
}
}
CREATE TABLE users (
id integer primarykey,
name text not null,
age integer
);
table name: users
column name: id, type: integer, constraint: primarykey,
column name: name, type: text, constraint: not null,
column name: age, type: integer, constraint: None