我想从字符串中提取标题和2或3位ISO 639代码.
有效字符串的一般格式是:
header + <special char> + <2 or 3 digit code> + (<special char>forced)
最后一部分<special character>forced是可选的,可能存在也可能不存在,但如果存在,则forced必须在其前面加上特殊字符(如.或_或-),以使其成为有效的字符串.
eng要提取的标头和语言代码()的有效字符串示例如下:
name.eng
name-eng
name(eng)
name(fri)_eng
name(fri)(eng)
name.eng.forced
name(eng).forced
name.(eng).forced
name.fri.eng.forced
name(fri).eng.forced
name.(fri).eng_forced
name-fri-eng.forced
name_(fri)_eng.forced
name(fri)_eng.forced
name(friday)_eng_forced
name(fri)(eng).forced
Run Code Online (Sandbox Code Playgroud)
这里的一个检查是,如果语言代码有一个)后面的话,它必须有一个(之前.这并不重要,但如果正则表达式可以检查它会很好.
无效字符串的示例如下:
nameeng
nameeng.forced
name.eng).forced
name(fri)eng.forced
name(friday).engforced
name(fri)(eng)forced
Run Code Online (Sandbox Code Playgroud)
我想出来检查这个是:
(.*)([._\-(])([a-z][a-z][a-z]|[a-z][a-z])((?<=\(...)\))?(.forced)?
我也正在尝试非关键的回顾来检查(语言代码之前是否有)代码之后.这再次并不重要,但不是我面临的核心问题.
问题是标题(以及语言代码)对于某些有效名称是不正确的,因为我认为表达式太贪婪(我使用C#,无法关闭所有操作数的贪婪).我尝试了从右到左的选项,但在重新排列表达式之后似乎没有用.
是否有可能通过C#中的Regex实现我的需求?
我正在尝试删除符合条件的IDictionary对象中的所有元素.
例如,IDictionary包含一组键和相应的值(比如说80个对象).键是字符串,值可以是不同类型(想想使用directshow从wtv文件中提取元数据).
一些键包含文本"thumb",例如thumbsize,startthumbdate等.我想删除IDictionary中包含单词thumb的所有对象.
我在这里看到的唯一方法是使用.Remove方法手动指定每个键名.
有没有办法让所有对象包含单词thumb的对象,并将它们从IDictionary对象中删除.
代码如下所示:
IDictionary sourceAttrs = editor.GetAttributes();
Run Code Online (Sandbox Code Playgroud)
GetAttributes定义为:
public abstract IDictionary GetAttributes();
Run Code Online (Sandbox Code Playgroud)
我无法控制GetAttributes,它返回一个IDictionary对象,我只是通过在调试时查看它来了解内容.(可能是HashTable)
更新:感谢Tim的最终答案:
sourceAttrs = sourceAttrs.Keys.Cast<string>()
.Where(key => key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1)
.ToDictionary(key => key, key => sourceAttrs[key]);
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个扩展名(实际上取自Case insensitive'Contains(string)')
它在进行字符串比较时补偿土耳其测试.扩展本身很简单:
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
Run Code Online (Sandbox Code Playgroud)
现在关键是我正在试图弄清楚在哪里/如何包含这个,以便整个解决方案(包含多个项目,每个项目都有自己的命名空间和类),可以通过string.Contains轻松访问它.做class.string.Contains或其他方式.
假设有一个项目'Util',它包含在所有其他项目中,有些我可以将它放在Util中(没有类?),以便它可以作为string.Contains在整个解决方案中全局引用?
这甚至可能吗?如果是这样的话?
我有一个未知结构的嵌套映射,目标是遍历映射中的每个值,检查某个条件(例如null)的值,然后将其替换为其他值。如果地图结构已知,我可以看到如何做,但是这里的问题是它是未知的。
例如,这可以是传递的地图结构(或可以具有任意数量的嵌套地图):
?def map = [
a:5,
b:"r",
c:[ a1:0, b1:null ],
d:[ a2: [ a3:"", b3:99 ], b2:null ],
...
]
Run Code Online (Sandbox Code Playgroud)
通常对于一个简单的地图,可以使用this来更新值:
map.each { it.value == null ? it.value = "" : "" }
Run Code Online (Sandbox Code Playgroud)
但是,对于嵌套地图结构,此方法将不起作用。
有没有一种有效的方法来遍历未知地图的所有嵌套值以调查和更新这些值?
我认为只要对对象的引用或对象本身不改变,Monitor.Enter 就可以对对象的引用起作用。
这是我的简单案例,我有一个名为 QueueManager 的类,其中有一个队列。在操作队列之前,我使用此对象队列来使用 Monitor.Lock 进行锁定。我尝试了在队列对象上调用 Monitor.Lock 的简单测试,但失败了。知道为什么吗?
public class QueueManager
{
private List<ConversionJob> _jobQueue = new List<ConversionJob>();
public QueueManager()
{
}
public List<ConversionJob> Queue
{ get { return _jobQueue; } }
}
public class Main
{
private QueueManager qMgr = new QueueManager();
public Main()
{
try
{
Monitor.Enter(qMgr.Queue);
throw new Exception();
}
catch (Exception)
{
Monitor.Enter(qMgr.Queue);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不会死锁!我不明白为什么它不会陷入僵局。我尝试了这个,因为我怀疑锁被盗了,所以我把这个测试代码放进去,我很惊讶。
c# ×4
global-scope ×1
groovy ×1
idictionary ×1
locking ×1
match ×1
object ×1
regex ×1
string ×1
turkey-test ×1