我有以下正则表达式:(?:cassy\.jobs \((?:([a-z]+(?:_[a-z]+)?) [a-z]+(?:, )?)+(?:PRIMARY KEY \(([a-z]+(?:_[a-z]+)?)\)\))?)
还有折叠式弦:
CREATE TABLE cassy.jobs (job_id int, job_description text, maximum_salary double, minimum_salary double, PRIMARY KEY (job_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;, CREATE TABLE cassy.employees (employee_id int, email_add text, frst_name text, hire_date date, job_id int, last_name text, salary double, PRIMARY KEY (employee_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;]我希望捕获给定表的列名和主键(如果存在的话),但我只获得第一个捕获组和主键的最后出现。
我读过关于“重复捕获组与捕获重复组”的文章,但是解决方案似乎不起作用。经过几个小时的搜寻,我找不到答案。
我得到的是:
group #1: minimum_salary
group #2: job_id结果应该是:
group #1: job_id
group #2: job_description
group #3: maximum_salary
group #4: minimum_salary
group #5: job_id编辑:添加了java标记,如果这不能单独使用regex,则可以使用java代码。
发布于 2018-01-30 15:23:50
使用regex是可能的,但是需要2才能得到最终结果。使用regex的缩写,除了第二个regex之外,我们还可以从这个特定的表中提取列名:
regex1 = /(?:cassy\.jobs \(.*?\))/
regex2 = /(?:\s*([a-z_]+) [a-z]+|PRIMARY KEY\s\((.*?)\))/gm在Java中不是最有知识的,但在JS中,我会这样做:
let regex1 = /(?:cassy\.jobs \(.*?\))/,
regex2 = /(?:\s*([a-z_]+) [a-z]+|PRIMARY KEY\s\((.*?)\))/gm,
string = "CREATE TABLE cassy.jobs (job_id int, job_description text, maximum_salary double, minimum_salary double, PRIMARY KEY (job_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;, CREATE TABLE cassy.employees (employee_id int, email_add text, frst_name text, hire_date date, job_id int, last_name text, salary double, PRIMARY KEY (employee_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;]",
createTable = regex1.exec(string),
columnNames = [];
// Put all capture group matches into the columnNames array
while ((m = regex2.exec(createTable)) !== null) {
m.forEach((match, groupIndex) => {
if (match !== undefined && groupIndex !== 0) {
columnNames.push(match)
}
});
}
console.log(columnNames)
https://stackoverflow.com/questions/48523615
复制相似问题